home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / eplain / eplain.tex (.txt) < prev    next >
LaTeX Document  |  1994-05-01  |  77KB  |  2,088 lines

  1. %% @texfile{
  2. %%   author = "Karl Berry",
  3. %%   version = "2.6",
  4. %%   date = "Mon May  2 07:48:27 EDT 1994",
  5. %%   filename = "eplain.tex",
  6. %%   email = "karl@cs.umb.edu",
  7. %%   address = "135 Center Hill Rd. // Plymouth, MA 02360"
  8. %%   checksum = "2301    5656   77376",
  9. %%   codetable = "ISO/ASCII",
  10. %%   supported = "yes",
  11. %%   docstring = "This file defines macros that extend and expand on
  12. %%                plain TeX. eplain.tex is eplain.tex and the other
  13. %%                source files with comments stripped; see the original
  14. %%                files for author credits, etc.  And please base diffs
  15. %%                or other contributions on eplain.tex, not the
  16. %%                stripped-down eplain.tex.",
  17. \def\makeactive#1{\catcode`#1 = \active \ignorespaces}%
  18. \chardef\letter = 11
  19. \chardef\other = 12
  20. \edef\leftdisplays{\the\catcode`@}%
  21. \catcode`@ = \letter
  22. \let\@eplainoldatcode = \leftdisplays
  23. \toksdef\toks@ii = 2
  24. \def\uncatcodespecials{%
  25.    \def\do##1{\catcode`##1 = \other}%
  26.    \dospecials
  27.    \makeactive\^^M %
  28.    \long\gdef\letreturn#1{\let^^M = #1}%
  29. \let\@eattoken = \relax  % Define this, so \eattoken can be used in \edef.
  30. \def\eattoken{\let\@eattoken = }%
  31. \def\gobble#1{}%
  32. \def\gobbletwo#1#2{}%
  33. \def\gobblethree#1#2#3{}%
  34. \def\identity#1{#1}%
  35. \def\ifempty#1{\@@ifempty #1\@emptymarkA\@emptymarkB}%
  36. \def\@@ifempty#1#2\@emptymarkB{\ifx #1\@emptymarkA}%
  37. \def\@gobblemeaning#1:->{}%
  38. \def\sanitize{\expandafter\@gobblemeaning\meaning}%
  39. \def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax}%
  40. \def\csn#1{\csname#1\endcsname}%
  41. \def\ece#1#2{\expandafter#1\csname#2\endcsname}%
  42. \def\expandonce{\expandafter\noexpand}%
  43. \let\@plainwlog = \wlog
  44. \let\wlog = \gobble
  45. \newlinechar = `^^J
  46. \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
  47. \def\loggingall{\tracingcommands\tw@\tracingstats\tw@
  48.    \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne
  49.    \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne
  50.    \showboxbreadth\maxdimen\showboxdepth\maxdimen
  51. \def\tracingboxes{\showboxbreadth = \maxdimen \showboxdepth = \maxdimen}%
  52. \def\gtracingoff{\begingroup \globaldefs = 1 \tracingoff \endgroup}%
  53. \def\tracingoff{\tracingonline\z@\tracingcommands\z@\tracingstats\z@
  54.   \tracingpages\z@\tracingoutput\z@\tracinglostchars\z@
  55.   \tracingmacros\z@\tracingparagraphs\z@\tracingrestores\z@
  56.   \showboxbreadth5 \showboxdepth3
  57. \begingroup
  58.   \catcode`\{ = 12 \catcode`\} = 12
  59.   \catcode`\[ = 1 \catcode`\] = 2
  60.   \gdef\lbracechar[{]%
  61.   \gdef\rbracechar[}]%
  62.   \catcode`\% = \other
  63.   \gdef\percentchar[%]\endgroup
  64. \def^^L{\par}%
  65. \def\vpenalty{\ifhmode\par\fi \penalty}%
  66. \def\hpenalty{\ifvmode\leavevmode\fi \penalty}%
  67. \def\iterate{%
  68.   \let\next\relax
  69.   \body
  70.   \let\next\iterate
  71.   \fi
  72.   \next
  73. \def\edefappend#1#2{%
  74.   \toks@ = \expandafter{#1}%
  75.   \edef#1{\the\toks@ #2}%
  76. \long\def\hookprepend{\@hookassign{\the\toks@ii \the\toks@}}%
  77. \long\def\hookappend{\@hookassign{\the\toks@ \the\toks@ii}}%
  78. \let\hookaction = \hookappend % either one should be ok
  79. \long\def\@hookassign#1#2#3{%
  80.   \expandafter\ifx\csname @#2hook\endcsname \relax
  81.     \toks@ = {}%
  82.   \else
  83.     \expandafter\let\expandafter\temp \csname @#2hook\endcsname
  84.     \toks@ = \expandafter{\temp}%
  85.   \fi
  86.   \toks2 = {#3}% Don't expand the argument all the way.
  87.   \ece\edef{@#2hook}{#1}%
  88. \long\def\hookactiononce#1#2{%
  89.   \edefappend#2{\global\let\noexpand#2\relax}
  90.   \hookaction{#1}#2%
  91. \def\hookrun#1{%
  92.   \expandafter\ifx\csname @#1hook\endcsname \relax \else
  93.     \def\temp{\csname @#1hook\endcsname}%
  94.     \expandafter\temp
  95.   \fi
  96. \def\setproperty#1#2#3{\ece\edef{#1@p#2}{#3}}%
  97. \def\getproperty#1#2{%
  98.   \expandafter\ifx\csname#1@p#2\endcsname\relax
  99.   \else \csname#1@p#2\endcsname
  100.   \fi
  101. \ifx\@undefinedmessage\@undefined
  102.   \def\@undefinedmessage
  103.     {No .aux file; I won't warn you about undefined labels.}%
  104. %% @texfile{
  105. %%   author = "Karl Berry and Oren Patashnik",
  106. %%   version = "0.99j",
  107. %%   date = "14 Mar 1992",
  108. %%   filename = "btxmac.tex",
  109. %%   address = "Please use electronic mail",
  110. %%   checksum = "834    4503   33061",
  111. %%   email = "opbibtex@cs.stanford.edu",
  112. %%   codetable = "ISO/ASCII",
  113. %%   supported = "yes",
  114. %%   docstring = "Defines macros that make BibTeX work with plain TeX",
  115. \edef\cite{\the\catcode`@}%
  116. \catcode`@ = 11
  117. \let\@oldatcatcode = \cite
  118. \chardef\@letter = 11
  119. \chardef\@other = 12
  120. \def\@innerdef#1#2{\edef#1{\expandafter\noexpand\csname #2\endcsname}}%
  121. \@innerdef\@innernewcount{newcount}%
  122. \@innerdef\@innernewdimen{newdimen}%
  123. \@innerdef\@innernewif{newif}%
  124. \@innerdef\@innernewwrite{newwrite}%
  125. \def\@gobble#1{}%
  126. \ifx\inputlineno\@undefined
  127.    \let\@linenumber = \empty % Pre-3.0.
  128. \else
  129.    \def\@linenumber{\the\inputlineno:\space}%
  130. \def\@futurenonspacelet#1{\def\cs{#1}%
  131.    \afterassignment\@stepone\let\@nexttoken=
  132. \begingroup % The grouping here avoids stepping on an outside use of `\\'.
  133. \def\\{\global\let\@stoken= }%
  134. \\ % now \@stoken is a space token (\\ is a control symbol, so that
  135. \endgroup
  136. \def\@stepone{\expandafter\futurelet\cs\@steptwo}%
  137. \def\@steptwo{\expandafter\ifx\cs\@stoken\let\@@next=\@stepthree
  138.    \else\let\@@next=\@nexttoken\fi \@@next}%
  139. \def\@stepthree{\afterassignment\@stepone\let\@@next= }%
  140. \def\@getoptionalarg#1{%
  141.    \let\@optionaltemp = #1%
  142.    \let\@optionalnext = \relax
  143.    \@futurenonspacelet\@optionalnext\@bracketcheck
  144. \def\@bracketcheck{%
  145.    \ifx [\@optionalnext
  146.       \expandafter\@@getoptionalarg
  147.    \else
  148.       \let\@optionalarg = \empty
  149.       \expandafter\@optionaltemp
  150.    \fi
  151. \def\@@getoptionalarg[#1]{%
  152.    \def\@optionalarg{#1}%
  153.    \@optionaltemp
  154. \def\@nnil{\@nil}%
  155. \def\@fornoop#1\@@#2#3{}%
  156. \def\@for#1:=#2\do#3{%
  157.    \edef\@fortmp{#2}%
  158.    \ifx\@fortmp\empty \else
  159.       \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}%
  160.    \fi
  161. \def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
  162.        #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi
  163. \def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
  164.        \let\@nextwhile=\@fornoop \else
  165.       #4\relax\let\@nextwhile=\@iforloop\fi\@nextwhile#2\@@#3{#4}%
  166. \@innernewif\if@fileexists
  167. \def\@testfileexistence{\@getoptionalarg\@finishtestfileexistence}%
  168. \def\@finishtestfileexistence#1{%
  169.    \begingroup
  170.       \def\extension{#1}%
  171.       \immediate\openin0 =
  172.          \ifx\@optionalarg\empty\jobname\else\@optionalarg\fi
  173.          \ifx\extension\empty \else .#1\fi
  174.          \space
  175.       \ifeof 0
  176.          \global\@fileexistsfalse
  177.       \else
  178.          \global\@fileexiststrue
  179.       \fi
  180.       \immediate\closein0
  181.    \endgroup
  182. \toks0 = {%
  183. \def\bibliographystyle#1{%
  184.    \@readauxfile
  185.    \@writeaux{\string\bibstyle{#1}}%
  186. \let\bibstyle = \@gobble
  187. \let\bblfilebasename = \jobname
  188. \def\bibliography#1{%
  189.    \@readauxfile
  190.    \@writeaux{\string\bibdata{#1}}%
  191.    \@testfileexistence[\bblfilebasename]{bbl}%
  192.    \if@fileexists
  193.       \nobreak
  194.       \@readbblfile
  195.    \fi
  196. \let\bibdata = \@gobble
  197. \def\nocite#1{%
  198.    \@readauxfile
  199.    \@writeaux{\string\citation{#1}}%
  200. \@innernewif\if@notfirstcitation
  201. \def\cite{\@getoptionalarg\@cite}%
  202. \def\@cite#1{%
  203.    \let\@citenotetext = \@optionalarg
  204.    \printcitestart
  205.    \nocite{#1}%
  206.    \@notfirstcitationfalse
  207.    \@for \@citation :=#1\do
  208.    {%
  209.       \expandafter\@onecitation\@citation\@@
  210.    }%
  211.    \ifx\empty\@citenotetext\else
  212.       \printcitenote{\@citenotetext}%
  213.    \fi
  214.    \printcitefinish
  215. \def\@onecitation#1\@@{%
  216.    \if@notfirstcitation
  217.       \printbetweencitations
  218.    \fi
  219.    \expandafter \ifx \csname\@citelabel{#1}\endcsname \relax
  220.       \if@citewarning
  221.          \message{\@linenumber Undefined citation `#1'.}%
  222.       \fi
  223.       \expandafter\gdef\csname\@citelabel{#1}\endcsname{%
  224.          {\tt
  225.             \escapechar = -1
  226.             \nobreak\hskip0pt
  227.             \expandafter\string\csname#1\endcsname
  228.             \nobreak\hskip0pt
  229.          }%
  230.       }%
  231.    \fi
  232.    \@printcitelabel{#1}%
  233.    \@notfirstcitationtrue
  234. \def\@printcitelabel#1{%
  235.    \csname\@citelabel{#1}\endcsname
  236. \def\@citelabel#1{b@#1}%
  237. \def\@citedef#1#2{\expandafter\gdef\csname\@citelabel{#1}\endcsname{#2}}%
  238. \def\@readbblfile{%
  239.    \ifx\@itemnum\@undefined
  240.       \@innernewcount\@itemnum
  241.    \fi
  242.    \begingroup
  243.       \ifx\begin\undefined
  244.          \def\begin##1##2{%
  245.             \setbox0 = \hbox{\biblabelcontents{##2}}%
  246.             \biblabelwidth = \wd0
  247.          }%
  248.          \let\end = \@gobble % The arg is `thebibliography' again.
  249.       \fi
  250.       \@itemnum = 0
  251.       \def\bibitem{\@getoptionalarg\@bibitem}%
  252.       \def\@bibitem{%
  253.          \ifx\@optionalarg\empty
  254.             \expandafter\@numberedbibitem
  255.          \else
  256.             \expandafter\@alphabibitem
  257.          \fi
  258.       }%
  259.       \def\@alphabibitem##1{%
  260.          \expandafter \xdef\csname\@citelabel{##1}\endcsname {\@optionalarg}%
  261.          \ifx\biblabelprecontents\@undefined
  262.             \let\biblabelprecontents = \relax
  263.          \fi
  264.          \ifx\biblabelpostcontents\@undefined
  265.             \let\biblabelpostcontents = \hss
  266.          \fi
  267.          \@finishbibitem{##1}%
  268.       }%
  269.       \def\@numberedbibitem##1{%
  270.          \advance\@itemnum by 1
  271.          \expandafter \xdef\csname\@citelabel{##1}\endcsname{\number\@itemnum}%
  272.          \ifx\biblabelprecontents\@undefined
  273.             \let\biblabelprecontents = \hss
  274.          \fi
  275.          \ifx\biblabelpostcontents\@undefined
  276.             \let\biblabelpostcontents = \relax
  277.          \fi
  278.          \@finishbibitem{##1}%
  279.       }%
  280.       \def\@finishbibitem##1{%
  281.          \biblabelprint{\csname\@citelabel{##1}\endcsname}%
  282.          \@writeaux{\string\@citedef{##1}{\csname\@citelabel{##1}\endcsname}}%
  283.          \ignorespaces
  284.       }%
  285.       \let\em = \bblem
  286.       \let\newblock = \bblnewblock
  287.       \let\sc = \bblsc
  288.       \frenchspacing
  289.       \clubpenalty = 4000 \widowpenalty = 4000
  290.       \tolerance = 10000 \hfuzz = .5pt
  291.       \everypar = {\hangindent = \biblabelwidth
  292.                       \advance\hangindent by \biblabelextraspace}%
  293.       \bblrm
  294.       \parskip = 1.5ex plus .5ex minus .5ex
  295.       \biblabelextraspace = .5em
  296.       \bblhook
  297.       \input \bblfilebasename.bbl
  298.    \endgroup
  299. \@innernewdimen\biblabelwidth
  300. \@innernewdimen\biblabelextraspace
  301. \def\biblabelprint#1{%
  302.    \noindent
  303.    \hbox to \biblabelwidth{%
  304.       \biblabelprecontents
  305.       \biblabelcontents{#1}%
  306.       \biblabelpostcontents
  307.    }%
  308.    \kern\biblabelextraspace
  309. \def\biblabelcontents#1{{\bblrm [#1]}}%
  310. \def\bblrm{\rm}%
  311. \def\bblem{\it}%
  312. \def\bblsc{\ifx\@scfont\@undefined
  313.               \font\@scfont = cmcsc10
  314.            \fi
  315.            \@scfont
  316. \def\bblnewblock{\hskip .11em plus .33em minus .07em }%
  317. \let\bblhook = \empty
  318. \def\printcitestart{[}%         left bracket
  319. \def\printcitefinish{]}%        right bracket
  320. \def\printbetweencitations{, }% comma, space
  321. \def\printcitenote#1{, #1}%     comma, space, note (if it exists)
  322. \let\citation = \@gobble
  323. \@innernewcount\@numparams
  324. \def\newcommand#1{%
  325.    \def\@commandname{#1}%
  326.    \@getoptionalarg\@continuenewcommand
  327. \def\@continuenewcommand{%
  328.    \@numparams = \ifx\@optionalarg\empty 0\else\@optionalarg \fi \relax
  329.    \@newcommand
  330. \def\@newcommand#1{%
  331.    \def\@startdef{\expandafter\edef\@commandname}%
  332.    \ifnum\@numparams=0
  333.       \let\@paramdef = \empty
  334.    \else
  335.       \ifnum\@numparams>9
  336.          \errmessage{\the\@numparams\space is too many parameters}%
  337.       \else
  338.          \ifnum\@numparams<0
  339.             \errmessage{\the\@numparams\space is too few parameters}%
  340.          \else
  341.             \edef\@paramdef{%
  342.                \ifcase\@numparams
  343.                   \empty  No arguments.
  344.                \or ####1%
  345.                \or ####1####2%
  346.                \or ####1####2####3%
  347.                \or ####1####2####3####4%
  348.                \or ####1####2####3####4####5%
  349.                \or ####1####2####3####4####5####6%
  350.                \or ####1####2####3####4####5####6####7%
  351.                \or ####1####2####3####4####5####6####7####8%
  352.                \or ####1####2####3####4####5####6####7####8####9%
  353.                \fi
  354.             }%
  355.          \fi
  356.       \fi
  357.    \fi
  358.    \expandafter\@startdef\@paramdef{#1}%
  359. \ifx\nobibtex\@undefined \the\toks0 \fi
  360. \def\@readauxfile{%
  361.    \if@auxfiledone \else % remember: \@auxfiledonetrue if \noauxfile is defined
  362.       \global\@auxfiledonetrue
  363.       \@testfileexistence{aux}%
  364.       \if@fileexists
  365.          \begingroup
  366.             \endlinechar = -1
  367.             \catcode`@ = 11
  368.             \input \jobname.aux
  369.          \endgroup
  370.       \else
  371.          \message{\@undefinedmessage}%
  372.          \global\@citewarningfalse
  373.       \fi
  374.       \immediate\openout\@auxfile = \jobname.aux
  375.    \fi
  376. \newif\if@auxfiledone
  377. \ifx\noauxfile\@undefined \else \@auxfiledonetrue\fi
  378. \@innernewwrite\@auxfile
  379. \def\@writeaux#1{\ifx\noauxfile\@undefined \write\@auxfile{#1}\fi}%
  380. \ifx\@undefinedmessage\@undefined
  381.    \def\@undefinedmessage{No .aux file; I won't give you warnings about
  382.                           undefined citations.}%
  383. \@innernewif\if@citewarning
  384. \ifx\noauxfile\@undefined \@citewarningtrue\fi
  385. \catcode`@ = \@oldatcatcode
  386. \let\auxfile = \@auxfile
  387. \let\for = \@for
  388. \let\futurenonspacelet = \@futurenonspacelet
  389. \def\iffileexists{\if@fileexists}%
  390. \let\innerdef = \@innerdef
  391. \let\innernewcount = \@innernewcount
  392. \let\innernewdimen = \@innernewdimen
  393. \let\innernewif = \@innernewif
  394. \let\innernewwrite = \@innernewwrite
  395. \let\linenumber = \@linenumber
  396. \let\readauxfile = \@readauxfile
  397. \let\spacesub = \@spacesub
  398. \let\testfileexistence = \@testfileexistence
  399. \let\writeaux = \@writeaux
  400. \def\innerinnerdef#1{\expandafter\innerdef\csname inner#1\endcsname{#1}}%
  401. \innerinnerdef{newbox}%
  402. \innerinnerdef{newfam}%
  403. \innerinnerdef{newhelp}%
  404. \innerinnerdef{newinsert}%
  405. \innerinnerdef{newlanguage}%
  406. \innerinnerdef{newmuskip}%
  407. \innerinnerdef{newread}%
  408. \innerinnerdef{newskip}%
  409. \innerinnerdef{newtoks}%
  410. \def\immediatewriteaux#1{%
  411.   \ifx\noauxfile\@undefined
  412.     \immediate\write\@auxfile{#1}%
  413.   \fi
  414. \begingroup
  415.    \makeactive\^^M \makeactive\ % No spaces or ^^M's from here on.
  416. \gdef\obeywhitespace{%
  417. \makeactive\^^M\def^^M{\par\futurelet\next\@finishobeyedreturn}%
  418. \makeactive\ \let =\ %
  419. \aftergroup\@removebox%
  420. \futurelet\next\@finishobeywhitespace%
  421. \gdef\@finishobeywhitespace{{%
  422. \ifx\next %
  423. \aftergroup\@obeywhitespaceloop%
  424. \else\ifx\next^^M%
  425. \aftergroup\gobble%
  426. \fi\fi}}%
  427. \gdef\@finishobeyedreturn{%
  428. \ifx\next^^M\vskip\blanklineskipamount\fi%
  429. \indent%
  430. \endgroup
  431. \def\@obeywhitespaceloop#1{\futurelet\next\@finishobeywhitespace}%
  432. \def\@removebox{%
  433.   \ifhmode
  434.     \setbox0 = \lastbox
  435.     \ifdim\wd0=\parindent
  436.       \setbox2 = \hbox{\unhbox0}%
  437.       \ifdim\wd2=0pt
  438.         \ignorespaces
  439.       \else
  440.         \box2 % Put it back: it wasn't empty.
  441.       \fi
  442.     \else
  443.        \box0 % Put it back: it wasn't the right width.
  444.     \fi
  445.   \fi
  446. \newskip\blanklineskipamount
  447. \blanklineskipamount = 0pt
  448. \def\frac#1/#2{\leavevmode
  449.    \kern.1em \raise .5ex \hbox{\the\scriptfont0 #1}%
  450.    \kern-.1em $/$%
  451.    \kern-.15em \lower .25ex \hbox{\the\scriptfont0 #2}%
  452. \newdimen\hruledefaultheight  \hruledefaultheight = 0.4pt
  453. \newdimen\hruledefaultdepth   \hruledefaultdepth = 0.0pt
  454. \newdimen\vruledefaultwidth   \vruledefaultwidth = 0.4pt
  455. \def\ehrule{\hrule height\hruledefaultheight depth\hruledefaultdepth}%
  456. \def\evrule{\vrule width\vruledefaultwidth}%
  457. %%% ====================================================================
  458. %%%  @TeX-style-file{
  459. %%%     author          = "Nelson H. F. Beebe",
  460. %%%     version         = "1.09",
  461. %%%     date            = "16 March 1993",
  462. %%%     time            = "10:08:05 MST",
  463. %%%     filename        = "texnames.sty",
  464. %%%     address         = "Center for Scientific Computing
  465. %%%                        Department of Mathematics
  466. %%%                        South Physics Building
  467. %%%                        University of Utah
  468. %%%                        Salt Lake City, UT 84112
  469. %%%                        USA
  470. %%%                        Tel: (801) 581-5254
  471. %%%                        FAX: (801) 581-4148",
  472. %%%     checksum        = "15888 291 1374 12268",
  473. %%%     email           = "beebe@magna.math.utah.edu (Internet)",
  474. %%%     codetable       = "ISO/ASCII",
  475. %%%     keywords        = "TeX names",
  476. %%%     supported       = "yes",
  477. %%%     docstring       = "This style file for AmSTeX, LaTeX, and TeX
  478. %%%                        defines macros for the names of TeX
  479. %%%                        and METAFONT programs, in several
  480. %%%                        letter-case variants:
  481. %%%                        \AMSTEX, \AMSTeX, \AmSTeX
  482. %%%                        \BIBTEX, \BIBTeX, \BibTeX
  483. %%%                        \LAMSTeX, \LAmSTeX
  484. %%%                        \LaTeX, \LATEX
  485. %%%                        \METAFONT, \MF
  486. %%%                        \SLITEX, \SLITeX, \SLiTeX, \SliTeX
  487. %%%                        It will NOT redefine any macro that
  488. %%%                        already exists, so it can be included
  489. %%%                        harmlessly after other style files.
  490. %%%                        In AmSTeX or Plain TeX, just do
  491. %%%                        \input texnames.sty
  492. %%%                        In LaTeX, do
  493. %%%                        \documentstyle[...,texnames]{...}
  494. %%%                        This file grew out of original work by
  495. %%%                        Richard Furuta
  496. %%%                        Department of Computer Science
  497. %%%                        University of Maryland
  498. %%%                        College Park, MD  20742
  499. %%%                        furuta@mimsy.umd.edu
  500. %%%                        seismo!umcp-cs!furuta
  501. %%%                        22 October 1986, first release (1.00)
  502. %%%                        1 April 1987 (1.01): Modified by William
  503. %%%                        LeFebvre, Rice University to include
  504. %%%                        definitions for BibTeX and SLiTeX, as they
  505. %%%                        appear in the LaTeX Local User's Guide
  506. %%%                        template (the file latex/local.tex in
  507. %%%                        standard distributions)
  508. %%%                        26 October 1991 (1.02): Modified by
  509. %%%                        Nelson H. F. Beebe <beebe@math.utah.edu> to
  510. %%%                        add several new macro names, and adapt for
  511. %%%                        use with Plain TeX and AmSTeX.
  512. %%%                        26 October 1991 (1.03): Add \LaTeX and
  513. %%%                        \LATEX
  514. %%%                        25 November 1991 (1.04): Add \LamSTeX
  515. %%%                        and \LAMSTeX
  516. %%%                        27 January 1991 (1.05 and 1.06): Add slanted
  517. %%%                        font support for \MF.  Make several comment
  518. %%%                        changes.  Add a couple of missing % at end
  519. %%%                        of line, and replace blank lines by empty
  520. %%%                        comments.
  521. %%%                        30 December 1992 (1.07): Use \TeX in
  522. %%%                        definitions of \BibTeX and \LaTeX.  Remove
  523. %%%                        occurrences of \rm.  Change \sc to use
  524. %%%                        \scriptfont instead of hardwiring cmcsc10.
  525. %%%                        Use \cal for \LAMSTeX.
  526. %%%                1 March 1993 (1.08): Consolidate \ifx's onto
  527. %%%                single lines for brevity.  Add
  528. %%%                \spacefactor1000 to definitions for \TeX and \MF.
  529. %%%                        16 March 1993 (1.09): Add \AmS, \AMS, \AmSLaTeX,
  530. %%%                        and \AMSLaTeX.
  531. %%%                        The checksum field above contains a CRC-16
  532. %%%                        checksum as the first value, followed by the
  533. %%%                        equivalent of the standard UNIX wc (word
  534. %%%                        count) utility output of lines, words, and
  535. %%%                        characters.  This is produced by Robert
  536. %%%                        Solovay's checksum utility.",
  537. %%%  }
  538. %%% ====================================================================
  539. \ifx\sc\undefined
  540.     \def\sc{%
  541.       \expandafter\ifx\the\scriptfont\fam\nullfont
  542.         \font\temp = cmr7 \temp
  543.       \else
  544.         \the\scriptfont\fam
  545.       \fi
  546.       \def\uppercasesc{\char\uccode`}%
  547.     }%
  548. \ifx\uppercasesc\undefined
  549.   \let\uppercasesc = \relax
  550. \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\spacefactor1000 }%
  551. \ifx\AmS\undefined
  552.     \def\AmS{{\the\textfont2 A}\kern-.1667em\lower.5ex\hbox
  553.         {\the\textfont2 M}\kern-.125em{\the\textfont2 S}}
  554. \ifx\AMS\undefined \let\AMS=\AmS \fi
  555. \ifx\AmSLaTeX\undefined
  556.     \def\AmSLaTeX{\AmS-\LaTeX}
  557. \ifx\AMSLaTeX\undefined \let\AMSLaTeX=\AmSLaTeX \fi
  558. \ifx\AmSTeX\undefined
  559.     \def\AmSTeX{$\cal A$\kern-.1667em\lower.5ex\hbox{$\cal M$}%
  560.             \kern-.125em$\cal S$-\TeX}%
  561. \ifx\AMSTEX\undefined \let\AMSTEX=\AmSTeX \fi
  562. \ifx\AMSTeX\undefined \let\AMSTeX=\AmSTeX \fi
  563. \ifx\BibTeX\undefined
  564.     \def\BibTeX{B{\sc \uppercasesc i\kern-.025em \uppercasesc b}\kern-.08em
  565.                 \TeX}%
  566. \ifx\BIBTeX\undefined \let\BIBTeX=\BibTeX \fi
  567. \ifx\BIBTEX\undefined \let\BIBTEX=\BibTeX \fi
  568. \ifx\LAMSTeX\undefined
  569.     \def\LAMSTeX{L\raise.42ex\hbox{\kern-.3em\the\scriptfont2 A}%
  570.                  \kern-.2em\lower.376ex\hbox{\the\textfont2 M}%
  571.                  \kern-.125em {\the\textfont2 S}-\TeX}%
  572. \ifx\LamSTeX\undefined \let\LamSTeX=\LAMSTeX \fi
  573. \ifx\LAmSTeX\undefined \let\LAmSTeX=\LAMSTeX \fi
  574. \ifx\LaTeX\undefined
  575.     \def\LaTeX{L\kern-.36em\raise.3ex\hbox{\sc \uppercasesc a}\kern-.15em\TeX}%
  576. \ifx\LATEX\undefined \let\LATEX=\LaTeX \fi
  577. \ifx\MF\undefined
  578.     \ifx\manfnt\undefined
  579.             \font\manfnt=logo10
  580.     \fi
  581.     \ifx\manfntsl\undefined
  582.             \font\manfntsl=logosl10
  583.     \fi
  584.     \def\MF{{\ifdim\fontdimen1\font>0pt \let\manfnt = \manfntsl \fi
  585.       {\manfnt META}\-{\manfnt FONT}}\spacefactor1000 }%
  586. \ifx\METAFONT\undefined \let\METAFONT=\MF \fi
  587. \ifx\SLITEX\undefined
  588.     \def\SLITEX{S\kern-.065em L\kern-.18em\raise.32ex\hbox{i}\kern-.03em\TeX}%
  589. \ifx\SLiTeX\undefined \let\SLiTeX=\SLITEX \fi
  590. \ifx\SliTeX\undefined \let\SliTeX=\SLITEX \fi
  591. \ifx\SLITeX\undefined \let\SLITeX=\SLITEX \fi
  592. %%%  @texfile{
  593. %%%     author          = "Philip Taylor",
  594. %%%     version         = "3.04",
  595. %%%     date            = "25 July 1992",
  596. %%%     time            = "17:07 EDT",
  597. %%%     filename        = "path.sty",
  598. %%%     address         = "The Computer Centre
  599. %%%                        RHBNC, University of London
  600. %%%                        Egham Hill
  601. %%%                        Egham, Surrey TW20 0EX, ENGLAND",
  602. %%%     telephone       = "Tel:   +44 784 443172",
  603. %%%     FAX             = "Fax:   +44 784 434348",
  604. %%%     checksum        = "41143 321 1758 13526",
  605. %%%     email           = "P.Taylor@Vax.Rhbnc.Ac.Uk (Internet)",
  606. %%%     codetable       = "ISO/ASCII",
  607. %%%     keywords        = "file name, filename, path name, pathname,
  608. %%%                        discretionary, discretionaries",
  609. %%%     supported       = "yes",
  610. %%%     docstring       = {Computer filenames, host names, and e-mail
  611. %%%                        addresses tend to be long strings that
  612. %%%                        cause line breaking problems for TeX.
  613. %%%                        Sometimes rather long strings are
  614. %%%                        encountered; here are two examples:
  615. %%% Friesland%rz.informatik.uni-hamburg.dbp.de%germany.csnet@relay.cs.net
  616. %%%                        mighty-mouse-gw.scrc.symbolics.com
  617. %%%                        This file defines a macro, \path|...|,
  618. %%%                        similar to LaTeX's \verb|...| macro, that
  619. %%%                        sets the text in the typewriter font,
  620. %%%                        allowing hyphen-less line breaks at
  621. %%%                        punctuation characters.
  622. %%%                        The default set of punctuation characters is
  623. %%%                        defined as
  624. %%%                        \discretionaries |~!@$%^&*()_+`-=#{"}[]:;'<>,.?\/|
  625. %%%                        However, you can change it as needed, for example:
  626. %%%                        \discretionaries +@%!.+
  627. %%%                        would assign to it the set @ % ! . which
  628. %%%                        commonly occur in electronic mail addresses.
  629. %%%                        The delimiter characters surrounding the
  630. %%%                        arguments to \discretionaries and \path
  631. %%%                        will normally be a punctuation character not
  632. %%%                        found in the argument, and not otherwise
  633. %%%                        significant to TeX.  In particular, backslash
  634. %%%                        cannot be used as a delimiter.  In the rare
  635. %%%                        event that this is required, set
  636. %%%                        \specialpathdelimiterstrue
  637. %%%                        This practice is not recommended, because TeX
  638. %%%                        then runs about four times slower while it is
  639. %%%                        typesetting \path\...\ requests.
  640. %%%                        \specialpathdelimitersfalse is the normal
  641. %%%                        setting.
  642. %%%                        This file may be used in Plain TeX or AmSTeX by
  643. %%%                        \input path.sty
  644. %%%                        and in LaTeX by
  645. %%%                        \documentstyle[...,path,...]{...}
  646. %%%                        The checksum field above contains a CRC-16
  647. %%%                        checksum as the first value, followed by the
  648. %%%                        equivalent of the standard UNIX wc (word
  649. %%%                        count) utility output of lines, words, and
  650. %%%                        characters.  This is produced by Robert
  651. %%%                        Solovay's checksum utility.}
  652. %%%  }
  653. \edef\path{\the\catcode`@}%
  654. \catcode`@ = 11
  655. \let\@oldatcatcode = \path
  656. \newcount \c@tcode
  657. \newcount \c@unter
  658. \newif \ifspecialpathdelimiters
  659. \begingroup
  660. \catcode `\ = 10
  661. \gdef \passivesp@ce { }%
  662. \catcode `\ = 13\relax%
  663. \gdef\activesp@ce{ }%
  664. \endgroup
  665. \def \discretionaries % <delim> <chars> <delim>
  666.     {\begingroup
  667.         \c@tcodes = 13
  668.         \discr@tionaries
  669.     }%
  670. \def \discr@tionaries #1% <delim>
  671.     {\def \discr@ti@naries ##1#1% <chars> <delim>
  672.          {\endgroup
  673.           \def \discr@ti@n@ries ####1% <char> or <delim>
  674.               {\if   \noexpand ####1\noexpand #1%
  675.                      \let \n@xt = \relax
  676.                \else
  677.                      \catcode `####1 = 13
  678.                      \def ####1{\discretionary
  679.                                   {\char `####1}{}{\char `####1}}%
  680.                      \let \n@xt = \discr@ti@n@ries
  681.                \fi
  682.                \n@xt
  683.               }%
  684.           \def \discr@ti@n@ri@s {\discr@ti@n@ries ##1#1}%
  685.          }%
  686.      \discr@ti@naries
  687.     }%
  688. \let\pathafterhook = \relax
  689. \def \path
  690.     {\ifspecialpathdelimiters
  691.         \begingroup
  692.         \c@tcodes = 12
  693.         \def \endp@th {\endgroup \endgroup \pathafterhook}%
  694.      \else
  695.         \def \endp@th {\endgroup \pathafterhook}%
  696.      \fi
  697.      \p@th
  698.     }%
  699. \def \p@th #1% <delim>
  700.     {\begingroup
  701.         \tt
  702.         \c@tcode = \catcode `#1
  703.         \discr@ti@n@ri@s
  704.         \catcode `\ = \active
  705.         \expandafter \edef \activesp@ce {\passivesp@ce \hbox {}}%
  706.         \catcode `#1 = \c@tcode
  707.         \def \p@@th ##1#1% <chars> <delim>
  708.             {\leavevmode \hbox {}##1%
  709.              \endp@th
  710.             }%
  711.      \p@@th
  712.     }%
  713. \def \c@tcodes {\afterassignment \c@tc@des \c@tcode}%
  714. \def \c@tc@des
  715.     {\c@unter = 0
  716.      \loop
  717.             \ifnum \catcode \c@unter = \c@tcode
  718.             \else
  719.                 \catcode \c@unter = \c@tcode
  720.             \fi
  721.      \ifnum \c@unter < 255
  722.             \advance \c@unter by 1
  723.      \repeat
  724.      \catcode `\ = 10
  725.     }%
  726. \catcode `\@ = \@oldatcatcode
  727. \discretionaries |~!@$%^&*()_+`-=#{}[]:";'<>,.?\/|%
  728. \def\blackbox{\vrule height .8ex width .6ex depth -.2ex \relax}% square bullet
  729. \def\makeblankbox#1#2{%
  730.   \ifvoid0
  731.     \errhelp = \@makeblankboxhelp
  732.     \errmessage{Box 0 is void}%
  733.   \fi
  734.   \hbox{\lower\dp0
  735.     \vbox{\hidehrule{#1}{#2}%
  736.       \kern -#1% overlap rules
  737.       \hbox to \wd0{\hidevrule{#1}{#2}%
  738.         \raise\ht0\vbox to #1{}% vrule height
  739.         \lower\dp0\vtop to #1{}% vrule depth
  740.         \hfil\hidevrule{#2}{#1}%
  741.       }%
  742.       \kern-#1\hidehrule{#2}{#1}%
  743.     }%
  744. \newhelp\@makeblankboxhelp{Assigning to the dimensions of a void^^J%
  745.   box has no effect.  Do `\string\setbox0=\string\null' before you^^J%
  746.   define its dimensions.}%
  747. \def\hidehrule#1#2{\kern-#1\hrule height#1 depth#2 \kern-#2}%
  748. \def\hidevrule#1#2{%
  749.   \kern-#1%
  750.   \dimen@=#1\advance\dimen@ by #2%
  751.   \vrule width\dimen@
  752.   \kern-#2%
  753. \newdimen\boxitspace \boxitspace = 3pt
  754. \long\def\boxit#1{%
  755.   \vbox{%
  756.     \ehrule
  757.     \hbox{%
  758.       \evrule
  759.       \kern\boxitspace
  760.       \vbox{\kern\boxitspace \parindent = 0pt #1\kern\boxitspace}%
  761.       \kern\boxitspace
  762.       \evrule
  763.     }%
  764.     \ehrule
  765. \def\numbername#1{\ifcase#1%
  766.    zero%
  767.    \or one%
  768.    \or two%
  769.    \or three%
  770.    \or four%
  771.    \or five%
  772.    \or six%
  773.    \or seven%
  774.    \or eight%
  775.    \or nine%
  776.    \or ten%
  777.    \or #1%
  778.    \fi
  779. \let\@plainnewif = \newif
  780. \let\@plainnewdimen = \newdimen
  781. \let\newif = \innernewif
  782. \let\newdimen = \innernewdimen
  783. \edef\@eplainoldandcode{\the\catcode`& }%
  784. \catcode`& = 11
  785. \toks0 = {%
  786. \edef\thinlines{\the\catcode`@ }%
  787. \catcode`@ = 11
  788. \let\@oldatcatcode = \thinlines
  789. \edef\@oldandcatcode{\the\catcode`& }%
  790. \catcode`& = 11
  791. \def\&whilenoop#1{}%
  792. \def\&whiledim#1\do #2{\ifdim #1\relax#2\&iwhiledim{#1\relax#2}\fi}%
  793. \def\&iwhiledim#1{\ifdim #1\let\&nextwhile=\&iwhiledim 
  794.         \else\let\&nextwhile=\&whilenoop\fi\&nextwhile{#1}}%
  795. \newif\if&negarg
  796. \newdimen\&wholewidth
  797. \newdimen\&halfwidth
  798. \font\tenln=line10
  799. \def\thinlines{\let\&linefnt\tenln \let\&circlefnt\tencirc
  800.   \&wholewidth\fontdimen8\tenln \&halfwidth .5\&wholewidth}%
  801. \def\thicklines{\let\&linefnt\tenlnw \let\&circlefnt\tencircw
  802.   \&wholewidth\fontdimen8\tenlnw \&halfwidth .5\&wholewidth}%
  803. \def\drawline(#1,#2)#3{\&xarg #1\relax \&yarg #2\relax \&linelen=#3\relax
  804.   \ifnum\&xarg =0 \&vline \else \ifnum\&yarg =0 \&hline \else \&sline\fi\fi}%
  805. \def\&sline{\leavevmode
  806.   \ifnum\&xarg< 0 \&negargtrue \&xarg -\&xarg \&yyarg -\&yarg
  807.   \else \&negargfalse \&yyarg \&yarg \fi
  808.   \ifnum \&yyarg >0 \&tempcnta\&yyarg \else \&tempcnta -\&yyarg \fi
  809.   \ifnum\&tempcnta>6 \&badlinearg \&yyarg0 \fi
  810.   \ifnum\&xarg>6 \&badlinearg \&xarg1 \fi
  811.   \setbox\&linechar\hbox{\&linefnt\&getlinechar(\&xarg,\&yyarg)}%
  812.   \ifnum \&yyarg >0 \let\&upordown\raise \&clnht\z@
  813.   \else\let\&upordown\lower \&clnht \ht\&linechar\fi
  814.   \&clnwd=\wd\&linechar
  815.   \&whiledim \&clnwd <\&linelen \do {%
  816.     \&upordown\&clnht\copy\&linechar
  817.     \advance\&clnht \ht\&linechar
  818.     \advance\&clnwd \wd\&linechar
  819.   \advance\&clnht -\ht\&linechar
  820.   \advance\&clnwd -\wd\&linechar
  821.   \&tempdima\&linelen\advance\&tempdima -\&clnwd
  822.   \&tempdimb\&tempdima\advance\&tempdimb -\wd\&linechar
  823.   \hskip\&tempdimb \multiply\&tempdima \@m
  824.   \&tempcnta \&tempdima \&tempdima \wd\&linechar \divide\&tempcnta \&tempdima
  825.   \&tempdima \ht\&linechar \multiply\&tempdima \&tempcnta
  826.   \divide\&tempdima \@m
  827.   \advance\&clnht \&tempdima
  828.   \ifdim \&linelen <\wd\&linechar \hskip \wd\&linechar
  829.   \else\&upordown\&clnht\copy\&linechar\fi}%
  830. \def\&hline{\vrule height \&halfwidth depth \&halfwidth width \&linelen}%
  831. \def\&getlinechar(#1,#2){\&tempcnta#1\relax\multiply\&tempcnta 8
  832.   \advance\&tempcnta -9 \ifnum #2>0 \advance\&tempcnta #2\relax\else
  833.   \advance\&tempcnta -#2\relax\advance\&tempcnta 64 \fi
  834.   \char\&tempcnta}%
  835. \def\drawvector(#1,#2)#3{\&xarg #1\relax \&yarg #2\relax
  836.   \&tempcnta \ifnum\&xarg<0 -\&xarg\else\&xarg\fi
  837.   \ifnum\&tempcnta<5\relax \&linelen=#3\relax
  838.     \ifnum\&xarg =0 \&vvector \else \ifnum\&yarg =0 \&hvector
  839.     \else \&svector\fi\fi\else\&badlinearg\fi}%
  840. \def\&hvector{\ifnum\&xarg<0 \rlap{\&linefnt\&getlarrow(1,0)}\fi \&hline
  841.   \ifnum\&xarg>0 \llap{\&linefnt\&getrarrow(1,0)}\fi}%
  842. \def\&vvector{\ifnum \&yarg <0 \&downvector \else \&upvector \fi}%
  843. \def\&svector{\&sline
  844.   \&tempcnta\&yarg \ifnum\&tempcnta <0 \&tempcnta=-\&tempcnta\fi
  845.   \ifnum\&tempcnta <5 
  846.     \if&negarg\ifnum\&yarg>0                   % 3d quadrant; dp > 0
  847.       \llap{\lower\ht\&linechar\hbox to\&linelen{\&linefnt
  848.         \&getlarrow(\&xarg,\&yyarg)\hss}}\else % 4th quadrant; ht > 0
  849.       \llap{\hbox to\&linelen{\&linefnt\&getlarrow(\&xarg,\&yyarg)\hss}}\fi
  850.     \else\ifnum\&yarg>0                        % 1st quadrant; ht > 0
  851.       \&tempdima\&linelen \multiply\&tempdima\&yarg
  852.       \divide\&tempdima\&xarg \advance\&tempdima-\ht\&linechar
  853.       \raise\&tempdima\llap{\&linefnt\&getrarrow(\&xarg,\&yyarg)}\else
  854.       \&tempdima\&linelen \multiply\&tempdima-\&yarg % 2d quadrant; dp > 0
  855.       \divide\&tempdima\&xarg
  856.       \lower\&tempdima\llap{\&linefnt\&getrarrow(\&xarg,\&yyarg)}\fi\fi
  857.   \else\&badlinearg\fi}%
  858. \def\&getlarrow(#1,#2){\ifnum #2 =\z@ \&tempcnta='33\else
  859. \&tempcnta=#1\relax\multiply\&tempcnta \sixt@@n \advance\&tempcnta
  860. -9 \&tempcntb=#2\relax\multiply\&tempcntb \tw@
  861. \ifnum \&tempcntb >0 \advance\&tempcnta \&tempcntb\relax
  862. \else\advance\&tempcnta -\&tempcntb\advance\&tempcnta 64
  863. \fi\fi\char\&tempcnta}%
  864. \def\&getrarrow(#1,#2){\&tempcntb=#2\relax
  865. \ifnum\&tempcntb < 0 \&tempcntb=-\&tempcntb\relax\fi
  866. \ifcase \&tempcntb\relax \&tempcnta='55 \or 
  867. \ifnum #1<3 \&tempcnta=#1\relax\multiply\&tempcnta
  868. 24 \advance\&tempcnta -6 \else \ifnum #1=3 \&tempcnta=49
  869. \else\&tempcnta=58 \fi\fi\or 
  870. \ifnum #1<3 \&tempcnta=#1\relax\multiply\&tempcnta
  871. 24 \advance\&tempcnta -3 \else \&tempcnta=51\fi\or 
  872. \&tempcnta=#1\relax\multiply\&tempcnta
  873. \sixt@@n \advance\&tempcnta -\tw@ \else
  874. \&tempcnta=#1\relax\multiply\&tempcnta
  875. \sixt@@n \advance\&tempcnta 7 \fi\ifnum #2<0 \advance\&tempcnta 64 \fi
  876. \char\&tempcnta}%
  877. \def\&vline{\ifnum \&yarg <0 \&downline \else \&upline\fi}%
  878. \def\&upline{\hbox to \z@{\hskip -\&halfwidth \vrule width \&wholewidth
  879.    height \&linelen depth \z@\hss}}%
  880. \def\&downline{\hbox to \z@{\hskip -\&halfwidth \vrule width \&wholewidth
  881.    height \z@ depth \&linelen \hss}}%
  882. \def\&upvector{\&upline\setbox\&tempboxa\hbox{\&linefnt\char'66}\raise 
  883.      \&linelen \hbox to\z@{\lower \ht\&tempboxa\box\&tempboxa\hss}}%
  884. \def\&downvector{\&downline\lower \&linelen
  885.       \hbox to \z@{\&linefnt\char'77\hss}}%
  886. \def\&badlinearg{\errmessage{Bad \string\arrow\space argument.}}%
  887. \thinlines
  888. \countdef\&xarg     0
  889. \countdef\&yarg     2
  890. \countdef\&yyarg    4
  891. \countdef\&tempcnta 6
  892. \countdef\&tempcntb 8
  893. \dimendef\&linelen  0
  894. \dimendef\&clnwd    2
  895. \dimendef\&clnht    4
  896. \dimendef\&tempdima 6
  897. \dimendef\&tempdimb 8
  898. \chardef\@arrbox    0
  899. \chardef\&linechar  2
  900. \chardef\&tempboxa  2           % \&linechar and \&tempboxa don't interfere.
  901. \let\lft^%
  902. \let\rt_% distinguish between \rt and \lft
  903. \newif\if@pslope % test for positive slope
  904. \def\@findslope(#1,#2){\ifnum#1>0
  905.   \ifnum#2>0 \@pslopetrue \else\@pslopefalse\fi \else
  906.   \ifnum#2>0 \@pslopefalse \else\@pslopetrue\fi\fi}%
  907. \def\generalsmap(#1,#2){\getm@rphposn(#1,#2)\plnmorph\futurelet\next\addm@rph}%
  908. \def\sline(#1,#2){\setbox\@arrbox=\hbox{\drawline(#1,#2){\sarrowlength}}%
  909.   \@findslope(#1,#2)\d@@blearrfalse\generalsmap(#1,#2)}%
  910. \def\arrow(#1,#2){\setbox\@arrbox=\hbox{\drawvector(#1,#2){\sarrowlength}}%
  911.   \@findslope(#1,#2)\d@@blearrfalse\generalsmap(#1,#2)}%
  912. \newif\ifd@@blearr
  913. \def\bisline(#1,#2){\@findslope(#1,#2)%
  914.   \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
  915.   \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel
  916.     \rlap{\drawline(#1,#2){\sarrowlength}}%
  917.       \hskip\@hchannel\hbox{\drawline(#1,#2){\sarrowlength}}}%
  918.   \d@@blearrtrue\generalsmap(#1,#2)}%
  919. \def\biarrow(#1,#2){\@findslope(#1,#2)%
  920.   \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
  921.   \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel
  922.     \rlap{\drawvector(#1,#2){\sarrowlength}}%
  923.       \hskip\@hchannel\hbox{\drawvector(#1,#2){\sarrowlength}}}%
  924.   \d@@blearrtrue\generalsmap(#1,#2)}%
  925. \def\adjarrow(#1,#2){\@findslope(#1,#2)%
  926.   \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
  927.   \getch@nnel(#1,#2)\setbox\@arrbox=\hbox{\@upordown\@vchannel
  928.     \rlap{\drawvector(#1,#2){\sarrowlength}}%
  929.       \hskip\@hchannel\hbox{\drawvector(-#1,-#2){\sarrowlength}}}%
  930.   \d@@blearrtrue\generalsmap(#1,#2)}%
  931. \newif\ifrtm@rph
  932. \def\@shiftmorph#1{\hbox{\setbox0=\hbox{$\scriptstyle#1$}%
  933.   \setbox1=\hbox{\hskip\@hm@rphshift\raise\@vm@rphshift\copy0}%
  934.   \wd1=\wd0 \ht1=\ht0 \dp1=\dp0 \box1}}%
  935. \def\@hm@rphshift{\ifrtm@rph
  936.   \ifdim\hmorphposnrt=\z@\hmorphposn\else\hmorphposnrt\fi \else
  937.   \ifdim\hmorphposnlft=\z@\hmorphposn\else\hmorphposnlft\fi \fi}%
  938. \def\@vm@rphshift{\ifrtm@rph
  939.   \ifdim\vmorphposnrt=\z@\vmorphposn\else\vmorphposnrt\fi \else
  940.   \ifdim\vmorphposnlft=\z@\vmorphposn\else\vmorphposnlft\fi \fi}%
  941. \def\addm@rph{\ifx\next\lft\let\temp=\lftmorph\else
  942.   \ifx\next\rt\let\temp=\rtmorph\else\let\temp\relax\fi\fi \temp}%
  943. \def\plnmorph{\dimen1\wd\@arrbox \ifdim\dimen1<\z@ \dimen1-\dimen1\fi
  944.   \vcenter{\box\@arrbox}}%
  945. \def\lftmorph\lft#1{\rtm@rphfalse \setbox0=\@shiftmorph{#1}%
  946.   \if@pslope \let\@upordown\raise \else \let\@upordown\lower\fi
  947.   \llap{\@upordown\@vmorphdflt\hbox to\dimen1{\hss % \dimen1=\wd\@arrbox
  948.     \llap{\box0}\hss}\hskip\@hmorphdflt}\futurelet\next\addm@rph}%
  949. \def\rtmorph\rt#1{\rtm@rphtrue \setbox0=\@shiftmorph{#1}%
  950.   \if@pslope \let\@upordown\lower \else \let\@upordown\raise\fi
  951.   \llap{\@upordown\@vmorphdflt\hbox to\dimen1{\hss
  952.     \rlap{\box0}\hss}\hskip-\@hmorphdflt}\futurelet\next\addm@rph}%
  953. \def\getm@rphposn(#1,#2){\ifd@@blearr \dimen@\morphdist \advance\dimen@ by
  954.   .5\channelwidth \@getshift(#1,#2){\@hmorphdflt}{\@vmorphdflt}{\dimen@}\else
  955.   \@getshift(#1,#2){\@hmorphdflt}{\@vmorphdflt}{\morphdist}\fi}%
  956. \def\getch@nnel(#1,#2){\ifdim\hchannel=\z@ \ifdim\vchannel=\z@
  957.     \@getshift(#1,#2){\@hchannel}{\@vchannel}{\channelwidth}%
  958.     \else \@hchannel\hchannel \@vchannel\vchannel \fi
  959.   \else \@hchannel\hchannel \@vchannel\vchannel \fi}%
  960. \def\@getshift(#1,#2)#3#4#5{\dimen@ #5\relax
  961.   \&xarg #1\relax \&yarg #2\relax
  962.   \ifnum\&xarg<0 \&xarg -\&xarg \fi
  963.   \ifnum\&yarg<0 \&yarg -\&yarg \fi
  964.   \ifnum\&xarg<\&yarg \&negargtrue \&yyarg\&xarg \&xarg\&yarg \&yarg\&yyarg\fi
  965.   \ifcase\&xarg \or  % There is no case 0
  966.     \ifcase\&yarg    % case 1
  967.       \dimen@i \z@ \dimen@ii \dimen@ \or % case (1,0)
  968.       \dimen@i .7071\dimen@ \dimen@ii .7071\dimen@ \fi \or
  969.     \ifcase\&yarg    % case 2
  970.       \or % case 0,2 wrong
  971.       \dimen@i .4472\dimen@ \dimen@ii .8944\dimen@ \fi \or
  972.     \ifcase\&yarg    % case 3
  973.       \or % case 0,3 wrong
  974.       \dimen@i .3162\dimen@ \dimen@ii .9486\dimen@ \or
  975.       \dimen@i .5547\dimen@ \dimen@ii .8321\dimen@ \fi \or
  976.     \ifcase\&yarg    % case 4
  977.       \or % case 0,2,4 wrong
  978.       \dimen@i .2425\dimen@ \dimen@ii .9701\dimen@ \or\or
  979.       \dimen@i .6\dimen@ \dimen@ii .8\dimen@ \fi \or
  980.     \ifcase\&yarg    % case 5
  981.       \or % case 0,5 wrong
  982.       \dimen@i .1961\dimen@ \dimen@ii .9801\dimen@ \or
  983.       \dimen@i .3714\dimen@ \dimen@ii .9284\dimen@ \or
  984.       \dimen@i .5144\dimen@ \dimen@ii .8575\dimen@ \or
  985.       \dimen@i .6247\dimen@ \dimen@ii .7801\dimen@ \fi \or
  986.     \ifcase\&yarg    % case 6
  987.       \or % case 0,2,3,4,6 wrong
  988.       \dimen@i .1645\dimen@ \dimen@ii .9864\dimen@ \or\or\or\or
  989.       \dimen@i .6402\dimen@ \dimen@ii .7682\dimen@ \fi \fi
  990.   \if&negarg \&tempdima\dimen@i \dimen@i\dimen@ii \dimen@ii\&tempdima\fi
  991.   #3\dimen@i\relax #4\dimen@ii\relax }%
  992. \catcode`\&=4  % Back to alignment tab
  993. \catcode`& = 4
  994. \toks2 = {%
  995. \catcode`\&=4  % Back to alignment tab
  996. \def\generalhmap{\futurelet\next\@generalhmap}%
  997. \def\@generalhmap{\ifx\next^ \let\temp\generalhm@rph\else
  998.   \ifx\next_ \let\temp\generalhm@rph\else \let\temp\m@kehmap\fi\fi \temp}%
  999. \def\generalhm@rph#1#2{\ifx#1^
  1000.     \toks@=\expandafter{\the\toks@#1{\rtm@rphtrue\@shiftmorph{#2}}}\else
  1001.     \toks@=\expandafter{\the\toks@#1{\rtm@rphfalse\@shiftmorph{#2}}}\fi
  1002.   \generalhmap}%
  1003. \def\m@kehmap{\mathrel{\smash{\the\toks@}}}%
  1004. \def\mapright{\toks@={\mathop{\vcenter{\smash{\drawrightarrow}}}\limits}%
  1005.   \generalhmap}%
  1006. \def\mapleft{\toks@={\mathop{\vcenter{\smash{\drawleftarrow}}}\limits}%
  1007.   \generalhmap}%
  1008. \def\bimapright{\toks@={\mathop{\vcenter{\smash{\drawbirightarrow}}}\limits}%
  1009.   \generalhmap}%
  1010. \def\bimapleft{\toks@={\mathop{\vcenter{\smash{\drawbileftarrow}}}\limits}%
  1011.   \generalhmap}%
  1012. \def\adjmapright{\toks@={\mathop{\vcenter{\smash{\drawadjrightarrow}}}\limits}%
  1013.   \generalhmap}%
  1014. \def\adjmapleft{\toks@={\mathop{\vcenter{\smash{\drawadjleftarrow}}}\limits}%
  1015.   \generalhmap}%
  1016. \def\hline{\toks@={\mathop{\vcenter{\smash{\drawhline}}}\limits}%
  1017.   \generalhmap}%
  1018. \def\bihline{\toks@={\mathop{\vcenter{\smash{\drawbihline}}}\limits}%
  1019.   \generalhmap}%
  1020. \def\drawrightarrow{\hbox{\drawvector(1,0){\harrowlength}}}%
  1021. \def\drawleftarrow{\hbox{\drawvector(-1,0){\harrowlength}}}%
  1022. \def\drawbirightarrow{\hbox{\raise.5\channelwidth
  1023.   \hbox{\drawvector(1,0){\harrowlength}}\lower.5\channelwidth
  1024.   \llap{\drawvector(1,0){\harrowlength}}}}%
  1025. \def\drawbileftarrow{\hbox{\raise.5\channelwidth
  1026.   \hbox{\drawvector(-1,0){\harrowlength}}\lower.5\channelwidth
  1027.   \llap{\drawvector(-1,0){\harrowlength}}}}%
  1028. \def\drawadjrightarrow{\hbox{\raise.5\channelwidth
  1029.   \hbox{\drawvector(-1,0){\harrowlength}}\lower.5\channelwidth
  1030.   \llap{\drawvector(1,0){\harrowlength}}}}%
  1031. \def\drawadjleftarrow{\hbox{\raise.5\channelwidth
  1032.   \hbox{\drawvector(1,0){\harrowlength}}\lower.5\channelwidth
  1033.   \llap{\drawvector(-1,0){\harrowlength}}}}%
  1034. \def\drawhline{\hbox{\drawline(1,0){\harrowlength}}}%
  1035. \def\drawbihline{\hbox{\raise.5\channelwidth
  1036.   \hbox{\drawline(1,0){\harrowlength}}\lower.5\channelwidth
  1037.   \llap{\drawline(1,0){\harrowlength}}}}%
  1038. \def\generalvmap{\futurelet\next\@generalvmap}%
  1039. \def\@generalvmap{\ifx\next\lft \let\temp\generalvm@rph\else
  1040.   \ifx\next\rt \let\temp\generalvm@rph\else \let\temp\m@kevmap\fi\fi \temp}%
  1041. \toksdef\toks@@=1
  1042. \def\generalvm@rph#1#2{\ifx#1\rt % append
  1043.     \toks@=\expandafter{\the\toks@
  1044.       \rlap{$\vcenter{\rtm@rphtrue\@shiftmorph{#2}}$}}\else % prepend
  1045.     \toks@@={\llap{$\vcenter{\rtm@rphfalse\@shiftmorph{#2}}$}}%
  1046.     \toks@=\expandafter\expandafter\expandafter{\expandafter\the\expandafter
  1047.       \toks@@ \the\toks@}\fi \generalvmap}%
  1048. \def\m@kevmap{\the\toks@}%
  1049. \def\mapdown{\toks@={\vcenter{\drawdownarrow}}\generalvmap}%
  1050. \def\mapup{\toks@={\vcenter{\drawuparrow}}\generalvmap}%
  1051. \def\bimapdown{\toks@={\vcenter{\drawbidownarrow}}\generalvmap}%
  1052. \def\bimapup{\toks@={\vcenter{\drawbiuparrow}}\generalvmap}%
  1053. \def\adjmapdown{\toks@={\vcenter{\drawadjdownarrow}}\generalvmap}%
  1054. \def\adjmapup{\toks@={\vcenter{\drawadjuparrow}}\generalvmap}%
  1055. \def\vline{\toks@={\vcenter{\drawvline}}\generalvmap}%
  1056. \def\bivline{\toks@={\vcenter{\drawbivline}}\generalvmap}%
  1057. \def\drawdownarrow{\hbox to5pt{\hss\drawvector(0,-1){\varrowlength}\hss}}%
  1058. \def\drawuparrow{\hbox to5pt{\hss\drawvector(0,1){\varrowlength}\hss}}%
  1059. \def\drawbidownarrow{\hbox to5pt{\hss\hbox{\drawvector(0,-1){\varrowlength}}%
  1060.   \hskip\channelwidth\hbox{\drawvector(0,-1){\varrowlength}}\hss}}%
  1061. \def\drawbiuparrow{\hbox to5pt{\hss\hbox{\drawvector(0,1){\varrowlength}}%
  1062.   \hskip\channelwidth\hbox{\drawvector(0,1){\varrowlength}}\hss}}%
  1063. \def\drawadjdownarrow{\hbox to5pt{\hss\hbox{\drawvector(0,-1){\varrowlength}}%
  1064.   \hskip\channelwidth\lower\varrowlength
  1065.   \hbox{\drawvector(0,1){\varrowlength}}\hss}}%
  1066. \def\drawadjuparrow{\hbox to5pt{\hss\hbox{\drawvector(0,1){\varrowlength}}%
  1067.   \hskip\channelwidth\raise\varrowlength
  1068.   \hbox{\drawvector(0,-1){\varrowlength}}\hss}}%
  1069. \def\drawvline{\hbox to5pt{\hss\drawline(0,1){\varrowlength}\hss}}%
  1070. \def\drawbivline{\hbox to5pt{\hss\hbox{\drawline(0,1){\varrowlength}}%
  1071.   \hskip\channelwidth\hbox{\drawline(0,1){\varrowlength}}\hss}}%
  1072. \def\commdiag#1{\null\,
  1073.   \vcenter{\commdiagbaselines
  1074.   \m@th\ialign{\hfil$##$\hfil&&\hfil$\mkern4mu ##$\hfil\crcr
  1075.       \mathstrut\crcr\noalign{\kern-\baselineskip}
  1076.       #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}%
  1077. \def\commdiagbaselines{\baselineskip15pt \lineskip3pt \lineskiplimit3pt }%
  1078. \def\gridcommdiag#1{\null\,
  1079.   \vcenter{\offinterlineskip
  1080.   \m@th\ialign{&\vbox to\vgrid{\vss
  1081.     \hbox to\hgrid{\hss\smash{$##$}\hss}}\crcr
  1082.       \mathstrut\crcr\noalign{\kern-\vgrid}
  1083.       #1\crcr\mathstrut\crcr\noalign{\kern-.5\vgrid}}}\,}%
  1084. \newdimen\harrowlength \harrowlength=60pt
  1085. \newdimen\varrowlength \varrowlength=.618\harrowlength
  1086. \newdimen\sarrowlength \sarrowlength=\harrowlength
  1087. \newdimen\hmorphposn \hmorphposn=\z@
  1088. \newdimen\vmorphposn \vmorphposn=\z@
  1089. \newdimen\morphdist  \morphdist=4pt
  1090. \dimendef\@hmorphdflt 0       % These two dimensions are
  1091. \dimendef\@vmorphdflt 2       % defined by \getm@rphposn
  1092. \newdimen\hmorphposnrt  \hmorphposnrt=\z@
  1093. \newdimen\hmorphposnlft \hmorphposnlft=\z@
  1094. \newdimen\vmorphposnrt  \vmorphposnrt=\z@
  1095. \newdimen\vmorphposnlft \vmorphposnlft=\z@
  1096. \let\hmorphposnup=\hmorphposnrt
  1097. \let\hmorphposndn=\hmorphposnlft
  1098. \let\vmorphposnup=\vmorphposnrt
  1099. \let\vmorphposndn=\vmorphposnlft
  1100. \newdimen\hgrid \hgrid=15pt
  1101. \newdimen\vgrid \vgrid=15pt
  1102. \newdimen\hchannel  \hchannel=0pt
  1103. \newdimen\vchannel  \vchannel=0pt
  1104. \newdimen\channelwidth \channelwidth=3pt
  1105. \dimendef\@hchannel 0         % Defined via the
  1106. \dimendef\@vchannel 2         % macro \getch@nnel
  1107. \catcode`& = \@oldandcatcode
  1108. \catcode`@ = \@oldatcatcode
  1109. \let\newif = \@plainnewif
  1110. \let\newdimen = \@plainnewdimen
  1111. \ifx\noarrow\@undefined \the\toks0 \the\toks2 \fi
  1112. \catcode`& = \@eplainoldandcode
  1113. \def\environment#1{%
  1114.    \ifx\@groupname\@undefined\else
  1115.       \errhelp = \@unnamedendgrouphelp
  1116.       \errmessage{`\@groupname' was not closed by \string\endenvironment}%
  1117.    \fi
  1118.    \edef\@groupname{#1}%
  1119.    \begingroup
  1120.       \let\@groupname = \@undefined
  1121. \def\endenvironment#1{%
  1122.    \endgroup
  1123.    \edef\@thearg{#1}%
  1124.    \ifx\@groupname\@thearg
  1125.    \else
  1126.       \ifx\@groupname\@undefined
  1127.          \errhelp = \@isolatedendenvironmenthelp
  1128.          \errmessage{Isolated \string\endenvironment\space for `#1'}%
  1129.       \else
  1130.          \errhelp = \@mismatchedenvironmenthelp
  1131.          \errmessage{Environment `#1' ended, but `\@groupname' started}%
  1132.          \endgroup % Probably a typo in the names.
  1133.       \fi
  1134.    \fi
  1135.    \let\@groupname = \@undefined
  1136. \newhelp\@unnamedendgrouphelp{Most likely, you just forgot an^^J%
  1137.    \string\endenvironment.  Maybe you should try inserting another^^J%
  1138.    \string\endgroup to recover.}%
  1139. \newhelp\@isolatedendenvironmenthelp{You ended an environment X, but^^J%
  1140.    no \string\environment{X} to start it is anywhere in sight.^^J%
  1141.    You might also be at an \string\endenvironment\space that would match^^J%
  1142.    a \string\begingroup, i.e., you forgot an \string\endgroup.}%
  1143. \newhelp\@mismatchedenvironmenthelp{You started an environment named X, but^^J%
  1144.    you ended one named Y.  Maybe you made a typo in one^^J%
  1145.    or the other of the names?}%
  1146. \newif\ifenvironment
  1147. \def\checkenv{\ifenvironment \errhelp = \@interwovenenvhelp
  1148.    \errmessage{Interwoven environments}%
  1149.    \egroup \fi
  1150. \newhelp\@interwovenenvhelp{Perhaps you forgot to end the previous^^J%
  1151.    environment? I'm finishing off the current group,^^J%
  1152.    hoping that will fix it.}%
  1153. \newtoks\previouseverydisplay
  1154. \newdimen\leftdisplayindent
  1155. \newif\if@leftdisplays
  1156. \def\leftdisplays{%
  1157.   \if@leftdisplays\else
  1158.     \previouseverydisplay = \everydisplay
  1159.     \everydisplay = {\the\previouseverydisplay \leftdisplaysetup}%
  1160.     \let\@save@maybedisableeqno = \@maybedisableeqno
  1161.     \let\@saveeqno = \eqno
  1162.     \let\@saveleqno = \leqno
  1163.     \let\@saveeqalignno = \eqalignno
  1164.     \let\@saveleqalignno = \leqalignno
  1165.     \let\@maybedisableeqno = \relax
  1166.     \def\eqno{\hfill\textstyle\enspace}%
  1167.     \def\leqno{%
  1168.       \hfill
  1169.       \hbox to0pt\bgroup
  1170.         \kern-\displaywidth
  1171.         \kern-\displayindent
  1172.         $\aftergroup\@leftleqnoend
  1173.     }%
  1174.     \@redefinealignmentdisplays
  1175.     \@leftdisplaystrue
  1176.   \fi
  1177. \def\centereddisplays{%
  1178.   \if@leftdisplays
  1179.     \everydisplay = \previouseverydisplay
  1180.     \let\@maybedisableeqno = \@save@maybedisableeqno
  1181.     \let\eqno = \@saveeqno
  1182.     \let\leqno = \@saveleqno
  1183.     \let\eqalignno = \@saveeqalignno
  1184.     \let\leqalignno = \@saveleqalignno
  1185.     \@leftdisplaysfalse
  1186.   \fi
  1187. \def\leftdisplaysetup{%
  1188.   \hbox to\displaywidth\bgroup
  1189.     \strut
  1190.     \dimen@ = \parindent
  1191.       \advance\dimen@ by \leftdisplayindent 
  1192.       \advance\dimen@ by \leftskip
  1193.     \hskip\dimen@
  1194.     \advance\displayindent by \dimen@
  1195.     \advance\displaywidth by -\parindent
  1196.       \advance\displaywidth by -\leftdisplayindent
  1197.       \advance\displaywidth by -\leftskip
  1198.     $%
  1199.     \advance\hsize by -\displayindent
  1200.     \aftergroup\@lefteqend
  1201.     \displaystyle
  1202. \def\@lefteqend{\hfil\egroup$}% gets inserted between the ending $$
  1203. \def\@leftleqnoend{\hss \egroup$}%
  1204. \def\@redefinealignmentdisplays{%
  1205.   \def\displaylines##1{\displ@y
  1206.     \vcenter{%
  1207.       \halign{\hbox to\displaywidth{$\@lign\displaystyle####\hfil$\hfil}\crcr
  1208.               ##1\crcr}}}%
  1209.   \def\eqalignno##1{\displ@y
  1210.     \let\noalign = \@lefteqalignonoalign
  1211.     \vcenter{%
  1212.       \halign to\displaywidth{%
  1213.          \hfil $\@lign\displaystyle{####}$\tabskip\z@skip
  1214.         &$\@lign\displaystyle{{}####}$\hfil\tabskip\centering
  1215.         &\llap{$\@lign####$}\tabskip\z@skip\crcr
  1216.         ##1\crcr}}}%
  1217.   \def\leqalignno##1{\displ@y
  1218.     \let\eqno = \relax
  1219.     \vcenter{%
  1220.       \halign to\displaywidth{%
  1221.          \hfil$\@lign\displaystyle{####}$\tabskip\z@skip
  1222.         &$\@lign\displaystyle{{}####}$\hfil\tabskip\centering
  1223.         &\kern-\displaywidth
  1224.          \rlap{\kern-\displayindent $\@lign####$}%
  1225.          \tabskip\displaywidth\crcr
  1226.         ##1\crcr}}}%
  1227. \let\@primitivenoalign = \noalign
  1228. \newtoks\@everynoalign
  1229. \def\@lefteqalignonoalign#1{%
  1230.   \@primitivenoalign{%
  1231.     \advance\leftskip by -\parindent
  1232.     \advance\leftskip by -\leftdisplayindent
  1233.     \parskip = 0pt
  1234.     \parindent = 0pt
  1235.     \the\@everynoalign
  1236.     #1%
  1237. \def\monthname{%
  1238.    \ifcase\month
  1239.       \or Jan\or Feb\or Mar\or Apr\or May\or Jun%
  1240.       \or Jul\or Aug\or Sep\or Oct\or Nov\or Dec%
  1241.    \fi
  1242. \def\fullmonthname{%
  1243.    \ifcase\month
  1244.       \or January\or February\or March\or April\or May\or June%
  1245.       \or July\or August\or September\or October\or November\or December%
  1246.    \fi
  1247. \def\timestring{\begingroup
  1248.    \count0 = \time
  1249.    \divide\count0 by 60
  1250.    \count2 = \count0   % The hour, from zero to 23.
  1251.    \count4 = \time
  1252.    \multiply\count0 by 60
  1253.    \advance\count4 by -\count0   % The minute, from zero to 59.
  1254.    \ifnum\count4<10
  1255.       \toks1 = {0}%
  1256.    \else
  1257.       \toks1 = {}%
  1258.    \fi
  1259.    \ifnum\count2<12
  1260.       \toks0 = {a.m.}%
  1261.    \else
  1262.       \toks0 = {p.m.}%
  1263.       \advance\count2 by -12
  1264.    \fi
  1265.    \ifnum\count2=0
  1266.       \count2 = 12
  1267.    \fi
  1268.    \number\count2:\the\toks1 \number\count4 \thinspace \the\toks0
  1269. \endgroup}%
  1270. \def\timestamp{\number\day\space\monthname\space\number\year\quad\timestring}%
  1271. \def\today{\the\day\ \fullmonthname\ \the\year}%
  1272. \newskip\abovelistskipamount      \abovelistskipamount = .5\baselineskip
  1273.   \newcount\abovelistpenalty      \abovelistpenalty    = 10000
  1274.   \def\abovelistskip{\vpenalty\abovelistpenalty \vskip\abovelistskipamount}%
  1275. \newskip\interitemskipamount      \interitemskipamount = 0pt
  1276.   \newcount\belowlistpenalty      \belowlistpenalty    = -50
  1277.   \def\belowlistskip{\vpenalty\belowlistpenalty \vskip\belowlistskipamount}%
  1278. \newskip\belowlistskipamount      \belowlistskipamount = .5\baselineskip
  1279.   \newcount\interitempenalty      \interitempenalty    = 0
  1280.   \def\interitemskip{\vpenalty\interitempenalty \vskip\interitemskipamount}%
  1281. \newdimen\listleftindent    \listleftindent = 0pt
  1282. \newdimen\listrightindent   \listrightindent = 0pt        
  1283. \let\listmarkerspace = \enspace
  1284. \newtoks\everylist
  1285. \def\listcompact{\interitemskipamount = 0pt \relax}%
  1286. \newdimen\@listindent
  1287. \def\beginlist{%
  1288.   \abovelistskip
  1289.   \@listindent = \parindent
  1290.   \advance\@listindent by \listleftindent
  1291.   \advance\leftskip by \@listindent
  1292.   \advance\rightskip by \listrightindent
  1293.   \itemnumber = 1
  1294.   \the\everylist
  1295. \def\li{\@getoptionalarg\@finli}%
  1296. \def\@finli{%
  1297.   \ifx\@optionalarg\empty \else
  1298.     \expandafter\writeitemxref\expandafter{\@optionalarg}%
  1299.   \fi
  1300.   \ifnum\itemnumber=1 \else \interitemskip \fi
  1301.   \printitem
  1302.   \advance\itemnumber by 1
  1303.   \advance\itemletter by 1
  1304.   \advance\itemromannumeral by 1
  1305.   \ignorespaces
  1306. \def\writeitemxref#1{\definexref{#1}\marker{item}}%
  1307. \def\printitem{%
  1308.   \par
  1309.   \vskip-\parskip
  1310.   \noindent
  1311.   \printmarker\marker
  1312. \def\printmarker#1{\llap{\marker \enspace}}%
  1313. \def\endlist{\belowlistskip}%
  1314. \newcount\numberedlistdepth
  1315. \newcount\itemnumber
  1316. \newcount\itemletter
  1317. \newcount\itemromannumeral
  1318. \def\numberedmarker{%
  1319.   \ifcase\numberedlistdepth
  1320.       (impossible)%
  1321.   \or \printitemnumber
  1322.   \or \printitemletter
  1323.   \or \printitemromannumeral
  1324.   \else *%
  1325.   \fi
  1326. \def\printitemnumber{\number\itemnumber}%
  1327. \def\printitemletter{\char\the\itemletter}%
  1328. \def\printitemromannumeral{\romannumeral\itemromannumeral}%
  1329. \def\numberedprintmarker#1{\llap{#1) \listmarkerspace}}%
  1330. \def\numberedlist{\environment{@numbered-list}%
  1331.   \advance\numberedlistdepth by 1
  1332.   \itemletter = `a
  1333.   \itemromannumeral = 1
  1334.   \beginlist
  1335.   \let\marker = \numberedmarker
  1336.   \let\printmarker = \numberedprintmarker
  1337. \def\endnumberedlist{%
  1338.   \par
  1339.   \endenvironment{@numbered-list}%
  1340.   \endlist
  1341. \let\orderedlist = \numberedlist
  1342. \let\endorderedlist = \endnumberedlist
  1343. \newcount\unorderedlistdepth
  1344. \def\unorderedmarker{%
  1345.   \ifcase\unorderedlistdepth
  1346.       (impossible)%
  1347.   \or \blackbox
  1348.   \or ---%
  1349.   \else *%
  1350.   \fi
  1351. \def\unorderedprintmarker#1{\llap{#1\listmarkerspace}}%
  1352. \def\unorderedlist{\environment{@unordered-list}%
  1353.   \advance\unorderedlistdepth by 1
  1354.   \beginlist
  1355.   \let\marker = \unorderedmarker
  1356.   \let\printmarker = \unorderedprintmarker
  1357. \def\endunorderedlist{%
  1358.   \par
  1359.   \endenvironment{@unordered-list}%
  1360.   \endlist
  1361. \def\listing#1{%
  1362.    \par \begingroup
  1363.    \@setuplisting
  1364.    \setuplistinghook
  1365.    \input #1
  1366.    \endgroup
  1367. \let\setuplistinghook = \relax
  1368. \def\linenumberedlisting{%
  1369.   \ifx\lineno\undefined \innernewcount\lineno \fi
  1370.   \lineno = 0
  1371.   \everypar = {\advance\lineno by 1 \printlistinglineno}%
  1372. \def\printlistinglineno{\llap{[\the\lineno]\quad}}%
  1373. \def\listingfont{\tt}%
  1374. \def\@setuplisting{%
  1375.    \uncatcodespecials
  1376.    \obeywhitespace
  1377.    \makeactive\`
  1378.    \makeactive\^^I
  1379.    \def^^L{\vfill\eject}%
  1380.    \parskip = 0pt
  1381.    \listingfont
  1382.    \makeactive\`
  1383.    \gdef`{\relax\lq}% Defeat ligatures.
  1384.    \makeactive\^^I
  1385.    \gdef^^I{\hskip8\fontdimen2\font \relax}%
  1386. \def\verbatimescapechar#1{%
  1387.   \gdef\@makeverbatimescapechar{%
  1388.     \@makeverbatimdoubleescape #1%
  1389.     \catcode`#1 = 0
  1390. \def\@makeverbatimdoubleescape#1{%
  1391.   \catcode`#1 = \other
  1392.   \begingroup
  1393.     \lccode`\* = `#1%
  1394.     \lowercase{\endgroup \ece\def*{*}}%
  1395. \verbatimescapechar\|  % initially escapechar is |
  1396. \def\verbatim{\begingroup
  1397.   \uncatcodespecials
  1398.   \obeywhitespace
  1399.   \makeactive\` % make space character a single space, not stretchable
  1400.   \@makeverbatimescapechar
  1401.   \tt}
  1402. \let\endverbatim = \endgroup
  1403. \def\definecontentsfile#1{%
  1404.   \ece\innernewwrite{#1file}%
  1405.   \ece\innernewif{if@#1fileopened}%
  1406.   \ece\let{#1filebasename} = \jobname
  1407.   \ece\def{open#1file}{\opencontentsfile{#1}}%
  1408.   \ece\def{write#1entry}{\writecontentsentry{#1}}%
  1409.   \ece\def{writenumbered#1entry}{\writenumberedcontentsentry{#1}}%
  1410.   \ece\innernewif{ifrewrite#1file} \csname rewrite#1filetrue\endcsname
  1411.   \ece\def{read#1file}{\readcontentsfile{#1}}%
  1412. \definecontentsfile{toc}%
  1413. \def\opencontentsfile#1{%
  1414.   \csname if@#1fileopened\endcsname \else
  1415.      \ece{\immediate\openout}{#1file} = \csname #1filebasename\endcsname.#1
  1416.      \ece\global{@#1fileopenedtrue}%
  1417.   \fi
  1418. \def\writecontentsentry#1#2#3{\writenumberedcontentsentry{#1}{#2}{#3}{}}%
  1419. \def\writenumberedcontentsentry#1#2#3#4{%
  1420.   \csname ifrewrite#1file\endcsname
  1421.     \csname open#1file\endcsname
  1422.     \toks0 = {\expandafter\noexpand \csname #1#2entry\endcsname}%
  1423.     \def\temp{#3}%
  1424.     \toks2 = \expandafter{#4}%
  1425.     \edef\cs{\the\toks2}%
  1426.     \edef\@wr{%
  1427.       \write\csname #1file\endcsname{%
  1428.         \the\toks0 % the \toc...entry control sequence
  1429.         {\sanitize\temp}% the text
  1430.         \ifx\empty\cs\else {\sanitize\cs}\fi % A secondary number, or nothing:
  1431.         {\noexpand\folio}% the page number
  1432.       }%
  1433.     }%
  1434.     \@wr
  1435.   \fi
  1436.   \ignorespaces
  1437. \def\readcontentsfile#1{%
  1438.    \edef\temp{%
  1439.      \noexpand\testfileexistence[\csname #1filebasename\endcsname]{toc}%
  1440.    }\temp
  1441.    \if@fileexists
  1442.       \input \csname #1filebasename\endcsname.#1\relax
  1443.       \csname ifrewrite#1file\endcsname \csname open#1file\endcsname \endif
  1444.    \fi
  1445. \def\endif{\fi}%
  1446. \def\tocchapterentry#1#2{\line{\bf #1 \dotfill\ #2}}%
  1447. \def\tocsectionentry#1#2{\line{\quad\sl #1 \dotfill\ \rm #2}}%
  1448. \def\tocsubsectionentry#1#2{\line{\qquad\rm #1 \dotfill\ #2}}%
  1449. \let\ifxrefwarning = \iftrue
  1450. \def\xrefwarningtrue{\@citewarningtrue \let\ifxrefwarning = \iftrue}%
  1451. \def\xrefwarningfalse{\@citewarningfalse \let\ifxrefwarning = \iffalse}%
  1452. \begingroup
  1453.   \catcode`\_ = 8
  1454.   \gdef\xrlabel#1{#1_x}%
  1455. \endgroup
  1456. \def\xrdef#1{\definexref{#1}{\noexpand\folio}{page}}%
  1457. \def\definexref#1#2#3{%
  1458.   \edef\temp{#1}%
  1459.   \readauxfile
  1460.   \edef\@wr{\noexpand\writeaux{\string\@definelabel{\temp}{#2}{#3}}}%
  1461.   \@wr
  1462.   \ignorespaces
  1463. \def\@definelabel#1#2#3{%
  1464.   \expandafter\gdef\csname\xrlabel{#1}\endcsname{#2}%
  1465.   \global\setproperty{\xrlabel{#1}}{class}{#3}%
  1466. \def\xrefn#1{%
  1467.   \readauxfile
  1468.   \expandafter \ifx\csname\xrlabel{#1}\endcsname\relax
  1469.     \if@citewarning
  1470.        \message{\linenumber Undefined label `#1'.}%
  1471.     \fi
  1472.     \expandafter\def\csname\xrlabel{#1}\endcsname{%
  1473.       `{\tt
  1474.         \escapechar = -1
  1475.         \expandafter\string\csname#1\endcsname
  1476.       }'%
  1477.     }%
  1478.   \fi
  1479.   \csname\xrlabel{#1}\endcsname % Always produce something.
  1480. \let\refn = \xrefn
  1481. \def\xref{p.\thinspace\xrefn}%
  1482. \def\@maybewarnref{%
  1483.   \ifundefined{amsppt.sty}%
  1484.   \else
  1485.     \message{Warning: amsppt.sty and Eplain both define \string\ref. See
  1486.              the Eplain manual.}%
  1487.     \let\amsref = \ref
  1488.   \fi
  1489.   \let\ref = \eplainref
  1490.   \ref
  1491. \let\ref = \@maybewarnref
  1492. \def\eplainref{\@generalref{}}%
  1493. \def\refs{\@generalref s}%
  1494. \def\@generalref#1#2{%
  1495.   \readauxfile
  1496.   \edef\temp{\getproperty{\xrlabel{#2}}{class}}%
  1497.   \expandafter\ifx\csname \temp word\endcsname\relax \else
  1498.     \csname \temp word\endcsname
  1499.     #1\penalty\@M \ 
  1500.   \fi
  1501.   \refn{#2}%
  1502. \newcount\eqnumber
  1503. \newcount\subeqnumber
  1504. \def\eqdefn{\@getoptionalarg\@fineqdefn}%
  1505. \def\@fineqdefn#1{%
  1506.   \ifx\@optionalarg\empty
  1507.     \global\advance\eqnumber by 1
  1508.     \def\temp{\eqconstruct{\number\eqnumber}}%
  1509.   \else
  1510.     \def\temp{\noexpand\@optionalarg}%
  1511.   \fi
  1512.   \global\subeqnumber = 0
  1513.   \gdef\@currenteqlabel{#1}%
  1514.   \toks0 = \expandafter{\@currenteqlabel}%
  1515.   \begingroup
  1516.     \def\eqrefn{\noexpand\eqrefn}%
  1517.     \edef\temp{\noexpand\@eqdefn{\the\toks0}{\temp}}%
  1518.     \temp
  1519.   \endgroup
  1520. \def\eqsubdefn#1{%
  1521.   \global\advance\subeqnumber by 1
  1522.   \toks0 = {#1}%
  1523.   \toks2 = \expandafter{\@currenteqlabel}%
  1524.   \begingroup
  1525.     \def\eqrefn{\noexpand\eqrefn}%
  1526.     \def\eqsubreftext{\noexpand\eqsubreftext}%
  1527.     \edef\temp{%
  1528.       \noexpand\@eqdefn
  1529.         {\the\toks0}%
  1530.         {\eqsubreftext{\eqrefn{\the\toks2}}{\the\subeqnumber}}%
  1531.     }%
  1532.     \temp           
  1533.   \endgroup
  1534. \def\@eqdefn#1#2{%
  1535.   \definexref{#1}{#2}{eq}%
  1536.   \@definelabel{#1}{#2}{eq}%
  1537. \def\eqdef{\@getoptionalarg\@fineqdef}%
  1538. \def\@fineqdef{%
  1539.   \toks0 = \expandafter{\@optionalarg}%
  1540.   \edef\temp{\noexpand\@eqdef{\noexpand\eqdefn[\the\toks0]}}%
  1541.   \temp
  1542. \def\eqsubdef{\@eqdef\eqsubdefn}%
  1543. \def\@eqdef#1#2{%
  1544.   #1{#2}% Define the label.
  1545.   \@maybedisableeqno
  1546.   \eqno \eqref{#2}% Print the text.
  1547.   \@mayberestoreeqno
  1548.   \ignorespaces
  1549. \let\@mayberestoreeqno = \relax
  1550. \def\@maybedisableeqno{%
  1551.   \ifinner
  1552.     \global\let\eqno = \relax
  1553.     \global\let\@mayberestoreeqno = \@restoreeqno
  1554.   \fi
  1555. \let\@primitiveeqno = \eqno
  1556. \def\@restoreeqno{%
  1557.   \global\let\eqno = \@primitiveeqno
  1558.   \global\let\@mayberestoreeqno = \empty
  1559. \let\eqrefn = \xrefn
  1560. \def\eqref#1{\eqprint{\eqrefn{#1}}}%
  1561. \let\eqconstruct = \identity
  1562. \def\eqprint#1{(#1)}%
  1563. \def\eqsubreftext#1#2{#1.#2}%
  1564. \let\extraidxcmdsuffixes = \empty
  1565. \outer\def\defineindex#1{%
  1566.   \def\@idxprefix{#1}%
  1567.   \for\@idxcmd:=,marked,submarked,name%
  1568.                 \extraidxcmdsuffixes\do
  1569.     \@defineindexcmd\@idxcmd
  1570.   \ece\innernewwrite{@#1indexfile}%
  1571.   \ece\innernewif{if@#1indexfileopened}%
  1572. \newif\ifsilentindexentry
  1573. \def\@defineindexcmd#1{%
  1574.   \@defineoneindexcmd{s}{#1}\silentindexentrytrue
  1575.   \@defineoneindexcmd{}{#1}\silentindexentryfalse
  1576. \def\@defineoneindexcmd#1#2#3{%
  1577.   \toks@ = {#3}%
  1578.   \edef\temp{%
  1579.     \def
  1580.       \expandonce\csname#1\@idxprefix dx#2\endcsname % e.g., \idx or \sidxname.
  1581.       {\def\noexpand\@idxprefix{\@idxprefix}% define \@idxprefix
  1582.        \expandonce\csname @@#1idx#2\endcsname
  1583.       }%
  1584.     \def
  1585.       \expandonce\csname @@#1idx#2\endcsname{% e.g., \@@idx
  1586.         \the\toks@
  1587.         \noexpand\@idxgetrange\expandonce\csname @#1idx#2\endcsname
  1588.       }%
  1589.   \temp
  1590. \let\indexfilebasename = \jobname
  1591. \def\@idxwrite#1#2{%
  1592.   \csname if@\@idxprefix indexfileopened\endcsname \else
  1593.     \expandafter\immediate\openout\csname @\@idxprefix indexfile\endcsname =
  1594.       \indexfilebasename.\@idxprefix dx
  1595.     \expandafter\global\csname @\@idxprefix indexfileopenedtrue\endcsname
  1596.   \fi
  1597.   \def\temp{#1}%
  1598.   \edef\@wr{%
  1599.     \expandafter\write\csname @\@idxprefix indexfile\endcsname{%
  1600.       \string\indexentry
  1601.       {\sanitize\temp}%
  1602.       {\noexpand#2}%
  1603.     }%
  1604.   \@wr
  1605.   \ifindexproofing \insert\@indexproof{\indexproofterm{#1}}\fi
  1606.   \hookrun{afterindexterm}%
  1607.   \ifsilentindexentry \expandafter\ignorespaces\fi
  1608. \newif\ifindexproofing
  1609. \newinsert\@indexproof
  1610. \dimen\@indexproof = \maxdimen                  % No limit on number of terms.
  1611. \count\@indexproof = 0  \skip\@indexproof = 0pt % They take up no space.
  1612. \font\indexprooffont = cmtt8
  1613. \def\indexproofterm#1{\hbox{\strut \indexprooffont #1}}%
  1614. \let\@plainmakeheadline = \makeheadline
  1615. \def\makeheadline{%
  1616.   \indexproofunbox
  1617.   \@plainmakeheadline
  1618. \def\indexsetmargins{%
  1619.   \ifx\undefined\outsidemargin
  1620.     \dimen@ = 1in
  1621.     \advance\dimen@ by \hoffset
  1622.     \edef\outsidemargin{\the\dimen@}%
  1623.     \let\insidemargin = \outsidemargin
  1624.   \fi
  1625. \def\indexproofunbox{%
  1626.   \ifvoid\@indexproof\else
  1627.     \indexsetmargins
  1628.     \rlap{%
  1629.       \kern\hsize
  1630.       \ifodd\pageno \kern\outsidemargin \else \kern\insidemargin \fi
  1631.       \vbox to 0pt{\unvbox\@indexproof\vss}%
  1632.     }%
  1633.   \fi
  1634. \def\idxrangebeginword{begin}%
  1635. \def\idxbeginrangemark{(}% the corresponding magic char to go in the idx file
  1636. \def\idxrangeendword{end}%
  1637. \def\idxendrangemark{)}%
  1638. \def\idxseecmdword{see}%
  1639. \def\idxseealsocmdword{seealso}%
  1640. \newif\if@idxsee
  1641. \let\@idxseenterm = \relax
  1642. \def\idxpagemarkupcmdword{pagemarkup}%
  1643. \let\@idxpagemarkup = \relax
  1644. \def\@idxgetrange#1{%
  1645.   \let\@idxrangestr = \empty
  1646.   \let\@afteridxgetrange = #1%
  1647.   \@getoptionalarg\@finidxgetopt
  1648. \def\@finidxgetopt{%
  1649.   \for\@idxarg:=\@optionalarg\do{%
  1650.     \expandafter\@idxcheckpagemarkup\@idxarg=,%
  1651.     \ifx\@idxarg\idxrangebeginword
  1652.       \def\@idxrangestr{\idxencapoperator\idxbeginrangemark}%
  1653.     \else
  1654.       \ifx\@idxarg\idxrangeendword
  1655.         \def\@idxrangestr{\idxencapoperator\idxendrangemark}%
  1656.       \else
  1657.         \ifx\@idxarg\idxseecmdword
  1658.           \def\@idxpagemarkup{indexsee}%
  1659.           \@idxseetrue
  1660.         \else
  1661.           \ifx\@idxarg\idxseealsocmdword
  1662.             \def\@idxpagemarkup{indexseealso}%
  1663.             \@idxseetrue
  1664.           \else
  1665.              \ifx\@idxpagemarkup\relax
  1666.                \errmessage{Unrecognized index option `\@idxarg'}%
  1667.              \fi
  1668.           \fi
  1669.         \fi
  1670.       \fi
  1671.     \fi
  1672.   \@afteridxgetrange
  1673. \def\@idxcheckpagemarkup#1=#2,{%
  1674.   \def\temp{#1}%
  1675.   \ifx\temp\idxpagemarkupcmdword
  1676.     \if ,#2, % If #2 is empty, complain.
  1677.       \errmessage{Missing markup command to `pagemarkup'}%
  1678.     \else
  1679.       \def\temp##1={##1}%
  1680.       \edef\@idxpagemarkup{\temp\string#2}%
  1681.     \fi
  1682.   \fi
  1683. \def\idxsubentryseparator{!}%
  1684. \def\idxencapoperator{|}%
  1685. \def\idxmaxpagenum{99999}%
  1686. \newtoks\@idxmaintoks
  1687. \newtoks\@idxsubtoks
  1688. \def\@idxtokscollect{%
  1689.   \edef\temp{\the\@idxsubtoks}%
  1690.   \edef\@indexentry{%
  1691.     \the\@idxmaintoks
  1692.     \ifx\temp\empty\else \idxsubentryseparator\the\@idxsubtoks \fi
  1693.     \@idxrangestr
  1694.   \if@idxsee
  1695.     \@idxseefalse % Reset so the next term won't be a `see'.
  1696.     \edef\temp{\noexpand\@finidxtokscollect{\idxmaxpagenum}}%
  1697.   \else
  1698.     \def\temp{\@finfinidxtokscollect\folio}%
  1699.   \fi
  1700.   \temp
  1701. \def\@finidxtokscollect#1#2{%
  1702.   \def\@idxseenterm{#2}%
  1703.   \@finfinidxtokscollect{#1}%
  1704. \def\@finfinidxtokscollect#1{%
  1705.   \ifx\@idxpagemarkup\relax \else
  1706.     \toks@ = \expandafter{\@indexentry}%
  1707.     \edef\@indexentry{\the\toks@ \idxencapoperator \@idxpagemarkup}%
  1708.     \let\@idxpagemarkup = \relax
  1709.   \fi
  1710.   \ifx\@idxseenterm\relax \else
  1711.     \toks@ = \expandafter{\@indexentry}%
  1712.     \edef\@indexentry{\the\toks@{\sanitize\@idxseenterm}}%
  1713.     \let\@idxseenterm = \relax
  1714.   \fi
  1715.   \expandafter\@idxwrite\expandafter{\@indexentry}{#1}%
  1716. \def\@idxcollect#1#2{%
  1717.   \@idxmaintoks = {#1}%
  1718.   \@idxsubtoks = {#2}%
  1719.   \@idxtokscollect
  1720. \def\@idx#1{%
  1721.   #1% Produce TERM as output.
  1722.   \@idxcollect{#1}{}%
  1723. \def\@sidx#1{\@idxmaintoks = {#1}\@getoptionalarg\@finsidx}%
  1724. \def\@finsidx{%
  1725.   \@idxsubtoks = \expandafter{\@optionalarg}%
  1726.   \@idxtokscollect
  1727. \def\idxsortkeysep{@}% This `@' is catcode 11, but it doesn't matter.
  1728. \def\@idxconstructmarked#1#2#3{%
  1729.   \toks@ = {#2}% The control sequence.
  1730.   \toks2 = {#3}% The term.
  1731.   \edef\temp{\the\toks2 \idxsortkeysep \the\toks@{\the\toks2}}%
  1732.   #1 = \expandafter{\temp}%
  1733. \def\@idxmarked#1#2{%
  1734.   #1{#2}% Produce \CS{TERM} as output.
  1735.   \@idxconstructmarked\@idxmaintoks{#1}{#2}%
  1736.   \@idxsubtoks = {}%
  1737.   \@idxtokscollect
  1738. \def\@sidxmarked#1#2{%
  1739.   \@idxconstructmarked\toks@{#1}{#2}%
  1740.   \edef\temp{{\the\toks@}}%
  1741.   \expandafter\@sidx\temp
  1742. \def\@idxsubmarked#1#2#3{%
  1743.   #1 #2{#3}% produce `TERM \CS{SUBTERM} as output.
  1744.   \@sidxsubmarked{#1}{#2}{#3}%
  1745. \def\@sidxsubmarked#1#2#3{%
  1746.   \@idxmaintoks = {#1}%
  1747.   \@idxconstructmarked\@idxsubtoks{#2}{#3}%
  1748.   \@idxtokscollect
  1749. \def\idxnameseparator{, }% as in `Tachikawa, Elizabeth'
  1750. \def\@idxcollectname#1#2{%
  1751.   \def\temp{#1}%
  1752.   \ifx\temp\empty
  1753.     \toks@ = {}%
  1754.   \else
  1755.     \toks@ = {\idxnameseparator #1}%
  1756.   \fi
  1757.   \toks2 = {#2}%
  1758.   \edef\temp{\the\toks2 \the\toks@}%
  1759. \def\@idxname#1#2{%
  1760.   #1 #2% Separate the names by a space in the output.
  1761.   \@idxcollectname{#1}{#2}%
  1762.   \expandafter\@idxcollect\expandafter{\temp}{}%
  1763. \def\@sidxname#1#2{%
  1764.   \@idxcollectname{#1}{#2}%
  1765.   \expandafter\@sidx\expandafter{\temp}%
  1766. \let\indexfonts = \relax
  1767. \def\readindexfile#1{%
  1768.   \edef\@idxprefix{#1}%
  1769.   \testfileexistence[\indexfilebasename]{\@idxprefix nd}%
  1770.   \iffileexists \begingroup
  1771.     \ifx\begin\undefined
  1772.       \def\begin##1{\@beginindex}%
  1773.       \let\end = \@gobble
  1774.     \fi
  1775.     \input \indexfilebasename.\@idxprefix nd
  1776.     \singlecolumn
  1777.   \endgroup
  1778.   \else
  1779.     \message{No index file \indexfilebasename.\@idxprefix nd.}%
  1780.   \fi
  1781. \def\@beginindex{%
  1782.   \let\item = \@indexitem
  1783.   \let\subitem = \@indexsubitem
  1784.   \let\subsubitem = \@indexsubsubitem
  1785.   \indexfonts
  1786.   \doublecolumns
  1787.   \parindent = 0pt
  1788.   \hookrun{beginindex}%
  1789. \let\indexspace = \bigbreak
  1790. \let\afterindexterm = \quad
  1791. \newskip\aboveindexitemskipamount  \aboveindexitemskipamount = 0pt plus2pt
  1792. \def\aboveindexitemskip{\vskip\aboveindexitemskipamount}%
  1793. \def\@indexitem{\begingroup
  1794.   \@indexitemsetup
  1795.   \leftskip = 0pt
  1796.   \aboveindexitemskip
  1797.   \penalty-100 % Encourage page breaks before items.
  1798.   \def\par{\endgraf\endgroup\nobreak}%
  1799. \def\@indexsubitem{%
  1800.   \@indexitemsetup
  1801.   \leftskip = 1em
  1802. \def\@indexsubsubitem{%
  1803.   \@indexitemsetup
  1804.   \leftskip = 2em
  1805. \def\@indexitemsetup{%
  1806.   \par
  1807.   \hangindent = 1em
  1808.   \raggedright
  1809.   \hyphenpenalty = 10000
  1810.   \hookrun{indexitem}%
  1811. \def\seevariant{\it}%
  1812. \def\indexseeword{See}%
  1813. \def\indexsee#1#2{{\seevariant \indexseeword\ }#1}%
  1814. \def\indexseealsowords{see also}%
  1815. \def\indexseealso#1#2{{\seevariant \indexseealsowords\ }#1}%
  1816. \defineindex{i}%
  1817. \begingroup
  1818.   \catcode `\^^M = \active %
  1819.   \gdef\flushleft{%
  1820.     \def\@endjustifycmd{\@endflushleft}%
  1821.     \def\@eoljustifyaction{\null\hfil\break}%
  1822.     \let\@firstlinejustifyaction = \relax
  1823.     \@startjustify %
  1824.   \gdef\flushright{%
  1825.     \def\@endjustifycmd{\@endflushright}%
  1826.     \def\@eoljustifyaction{\break\null\hfil}%
  1827.     \def\@firstlinejustifyaction{\hfil\null}%
  1828.     \@startjustify %
  1829.   \gdef\center{%
  1830.     \def\@endjustifycmd{\@endcenter}%
  1831.     \def\@eoljustifyaction{\hfil\break\null\hfil}%
  1832.     \def\@firstlinejustifyaction{\hfil\null}%
  1833.     \@startjustify %
  1834.   \gdef\@startjustify{%
  1835.     \parskip = 0pt
  1836.     \catcode`\^^M = \active %
  1837.     \def^^M{\futurelet\next\@finjustifyreturn}%
  1838.     \def\@eateol##1^^M{%
  1839.       \def\temp{##1}%
  1840.       \@firstlinejustifyaction %
  1841.       \ifx\temp\empty\else \temp^^M\fi %
  1842.     }%
  1843.     \expandafter\aftergroup\@endjustifycmd %
  1844.     \checkenv \environmenttrue %
  1845.     \par\noindent %
  1846.     \@eateol %
  1847.   \gdef\@finjustifyreturn{%
  1848.     \@eoljustifyaction %
  1849.     \ifx\next^^M%
  1850.       \def\par{\endgraf\vskip\blanklineskipamount \global\let\par = \endgraf}%
  1851.       \@endjustifycmd %
  1852.       \noindent %
  1853.       \@firstlinejustifyaction %
  1854.     \fi %
  1855. \endgroup
  1856. \def\@endflushleft{\unpenalty{\parfillskip = 0pt plus1fil\par}\ignorespaces}%
  1857. \def\@endflushright{% Remove the \hfil\null\break we just put on.
  1858.    \unskip \setbox0=\lastbox \unpenalty
  1859.    {\parfillskip = 0pt \par}\ignorespaces
  1860. \def\@endcenter{% Remove the \hfil\null\break we just put on.
  1861.    \unskip \setbox0=\lastbox \unpenalty
  1862.    {\parfillskip = 0pt plus1fil \par}\ignorespaces
  1863. \newcount\abovecolumnspenalty   \abovecolumnspenalty = 10000
  1864. \newcount\@linestogo         % Lines remaining to process.
  1865. \newcount\@linestogoincolumn % Lines remaining in column.
  1866. \newcount\@columndepth       % Number of lines in a column.
  1867. \newdimen\@columnwidth       % Width of each column.
  1868. \newtoks\crtok  \crtok = {\cr}%
  1869. \newcount\currentcolumn
  1870. \def\makecolumns#1/#2: {\par \begingroup
  1871.    \@columndepth = #1
  1872.    \advance\@columndepth by #2
  1873.    \advance\@columndepth by -1
  1874.    \divide \@columndepth by #2
  1875.    \@linestogoincolumn = \@columndepth
  1876.    \@linestogo = #1
  1877.    \currentcolumn = 1
  1878.    \def\@endcolumnactions{%
  1879.       \ifnum \@linestogo<2 
  1880.          \the\crtok \egroup \endgroup \par % End \valign and \makecolumns.
  1881.       \else
  1882.          \global\advance\@linestogo by -1
  1883.          \ifnum\@linestogoincolumn<2
  1884.             \global\advance\currentcolumn by 1
  1885.             \global\@linestogoincolumn = \@columndepth
  1886.             \the\crtok
  1887.          \else
  1888.             &\global\advance\@linestogoincolumn by -1
  1889.          \fi
  1890.       \fi
  1891.    }%
  1892.    \makeactive\^^M
  1893.    \letreturn \@endcolumnactions
  1894.    \@columnwidth = \hsize
  1895.      \advance\@columnwidth by -\parindent
  1896.      \divide\@columnwidth by #2
  1897.    \penalty\abovecolumnspenalty
  1898.    \noindent % It's not a paragraph (usually).
  1899.    \valign\bgroup
  1900.      &\hbox to \@columnwidth{\strut \hsize = \@columnwidth ##\hfil}\cr
  1901. \newcount\footnotenumber
  1902. \newdimen\footnotemarkseparation \footnotemarkseparation = .5em
  1903. \newskip\interfootnoteskip \interfootnoteskip = 0pt
  1904. \newtoks\everyfootnote
  1905. \newdimen\footnoterulewidth \footnoterulewidth = 2in
  1906. \newdimen\footnoteruleheight \footnoteruleheight = 0.4pt
  1907. \newdimen\belowfootnoterulespace \belowfootnoterulespace = 2.6pt
  1908. \let\@plainfootnote = \footnote
  1909. \let\@plainvfootnote = \vfootnote
  1910. \def\vfootnote#1{\insert\footins\bgroup
  1911.   \interlinepenalty\interfootnotelinepenalty
  1912.   \splittopskip\ht\strutbox % top baseline for broken footnotes
  1913.   \advance\splittopskip by \interfootnoteskip
  1914.   \splitmaxdepth\dp\strutbox
  1915.   \floatingpenalty\@MM
  1916.   \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
  1917.   \everypar = {}%
  1918.   \parskip = 0pt % because of the vskip
  1919.   \ifnum\@numcolumns > 1 \hsize = \@normalhsize \fi
  1920.   \the\everyfootnote
  1921.   \vskip\interfootnoteskip
  1922.   \indent\llap{#1\kern\footnotemarkseparation}\footstrut\futurelet\next\fo@t
  1923. \def\footnoterule{\dimen@ = \footnoteruleheight
  1924.   \advance\dimen@ by \belowfootnoterulespace
  1925.   \kern-\dimen@
  1926.   \hrule width\footnoterulewidth height\footnoteruleheight depth0pt
  1927.   \kern\belowfootnoterulespace
  1928.   \vskip-\interfootnoteskip
  1929. \def\numberedfootnote{%
  1930.   \global\advance\footnotenumber by 1
  1931.   \@plainfootnote{$^{\number\footnotenumber}$}%
  1932. \newdimen\paperheight \paperheight = 11in
  1933. \def\topmargin{\afterassignment\@finishtopmargin \dimen@}%
  1934. \def\@finishtopmargin{%
  1935.   \dimen2 = \voffset        % Remember the old \voffset.
  1936.   \voffset = \dimen@ \advance\voffset by -1in
  1937.   \advance\dimen2 by -\voffset    % Compute the change in \voffset.
  1938.   \advance\vsize by \dimen2    % Change type area accordingly.
  1939. \def\advancetopmargin{%
  1940.   \dimen@ = 0pt \afterassignment\@finishadvancetopmargin \advance\dimen@
  1941. \def\@finishadvancetopmargin{%
  1942.   \advance\voffset by \dimen@
  1943.   \advance\vsize by -\dimen@
  1944. \def\bottommargin{\afterassignment\@finishbottommargin \dimen@}%
  1945. \def\@finishbottommargin{%
  1946.   \@computebottommargin        % Result in \dimen2.
  1947.   \advance\dimen2 by -\dimen@    % Compute the change in the bottom margin.
  1948.   \advance\vsize by \dimen2    % Change the type area.
  1949. \def\advancebottommargin{%
  1950.   \dimen@ = 0pt \afterassignment\@finishadvancebottommargin \advance\dimen@
  1951. \def\@finishadvancebottommargin{%
  1952.   \advance\vsize by -\dimen@
  1953. \def\@computebottommargin{%
  1954.   \dimen2 = \paperheight    % The total paper size.
  1955.   \advance\dimen2 by -\vsize    % Less the text size.
  1956.   \advance\dimen2 by -\voffset    % Less the offset at the top.
  1957.   \advance\dimen2 by -1in    % Less the default offset.
  1958. \newdimen\paperwidth \paperwidth = 8.5in
  1959. \def\leftmargin{\afterassignment\@finishleftmargin \dimen@}%
  1960. \def\@finishleftmargin{%
  1961.   \dimen2 = \hoffset        % Remember the old \hoffset.
  1962.   \hoffset = \dimen@ \advance\hoffset by -1in
  1963.   \advance\dimen2 by -\hoffset    % Compute the change in \hoffset.
  1964.   \advance\hsize by \dimen2    % Change type area accordingly.
  1965. \def\advanceleftmargin{%
  1966.   \dimen@ = 0pt \afterassignment\@finishadvanceleftmargin \advance\dimen@
  1967. \def\@finishadvanceleftmargin{%
  1968.   \advance\hoffset by \dimen@
  1969.   \advance\hsize by -\dimen@
  1970. \def\rightmargin{\afterassignment\@finishrightmargin \dimen@}%
  1971. \def\@finishrightmargin{%
  1972.   \@computerightmargin        % Result in \dimen2.
  1973.   \advance\dimen2 by -\dimen@    % Compute the change in the right margin.
  1974.   \advance\hsize by \dimen2    % Change the type area.
  1975. \def\advancerightmargin{%
  1976.   \dimen@ = 0pt \afterassignment\@finishadvancerightmargin \advance\dimen@
  1977. \def\@finishadvancerightmargin{%
  1978.   \advance\hsize by -\dimen@
  1979. \def\@computerightmargin{%
  1980.   \dimen2 = \paperwidth        % The total paper size.
  1981.   \advance\dimen2 by -\hsize    % Less the text size.
  1982.   \advance\dimen2 by -\hoffset    % Less the offset at the left.
  1983.   \advance\dimen2 by -1in    % Less the default offset.
  1984. \newskip\abovecolumnskip \abovecolumnskip = \bigskipamount
  1985. \newskip\belowcolumnskip \belowcolumnskip = \bigskipamount
  1986. \newdimen\gutter \gutter = 2pc
  1987. \newbox\@partialpage
  1988. \newdimen\@columnhsize
  1989. \newdimen\@normalhsize
  1990. \newdimen\@normalvsize
  1991. \newtoks\previousoutput
  1992. \def\quadcolumns{\@columns4}%
  1993. \def\triplecolumns{\@columns3}%
  1994. \def\doublecolumns{\@columns2}%
  1995. \def\begincolumns#1{\ifcase#1\relax \or \singlecolumn \or \@columns2 \or
  1996.                             \@columns3 \or \@columns4 \else \relax \fi}%
  1997. \let\endcolumns = \singlecolumn
  1998. \let\@ndcolumns = \relax
  1999. \chardef\@numcolumns = 1
  2000. \def\@columns#1{%
  2001.   \@ndcolumns
  2002.   \let\@ndcolumns = \@endcolumns
  2003.   \chardef\@numcolumns = #1
  2004.   \par                     % Shouldn't start in horizontal mode.
  2005.   \previousoutput = \expandafter{\the\output}%
  2006.   \@columnhsize = \hsize
  2007.   \count@ = \@numcolumns
  2008.   \advance\count@ by -1
  2009.   \advance\@columnhsize by -\count@\gutter
  2010.   \divide\@columnhsize by \@numcolumns
  2011.   \output = {\global\setbox\@partialpage =
  2012.     \vbox{\unvbox255\vskip\abovecolumnskip}%
  2013.   \pagegoal = \pagetotal
  2014.   \eject
  2015.   \output = {\@columnoutput}%
  2016.   \@normalhsize = \hsize
  2017.   \@normalvsize = \vsize
  2018.   \hsize = \@columnhsize
  2019.   \advance\vsize by -\ht\@partialpage
  2020.   \advance\vsize by -\ht\footins
  2021.   \ifvoid\footins\else \advance\vsize by -\skip\footins \fi
  2022.   \multiply\count\footins by \@numcolumns
  2023.   \advance\vsize by -\ht\topins
  2024.   \ifvoid\topins\else \advance\vsize by -\skip\topins \fi
  2025.   \multiply\count\topins by \@numcolumns
  2026.   \global\vsize = \@numcolumns\vsize
  2027. \def\@columnsplit{%
  2028.   \splittopskip = \topskip
  2029.   \splitmaxdepth = \baselineskip
  2030.   \dimen@ = \ht255
  2031.     \divide\dimen@ by \@numcolumns
  2032.  \begingroup
  2033.     \vbadness = 10000
  2034.     \global\setbox1 = \vsplit255 to \dimen@  \global\wd1 = \hsize
  2035.     \global\setbox3 = \vsplit255 to \dimen@  \global\wd3 = \hsize
  2036.     \ifnum\@numcolumns > 2
  2037.       \global\setbox5 = \vsplit255 to \dimen@ \global\wd5 = \hsize
  2038.     \fi
  2039.     \ifnum\@numcolumns > 3
  2040.       \global\setbox7 = \vsplit255 to \dimen@ \global\wd7 = \hsize
  2041.     \fi
  2042.   \endgroup
  2043.   \setbox0 = \box255
  2044.   \global\setbox255 = \vbox{%
  2045.     \unvbox\@partialpage
  2046.     \ifcase\@numcolumns \relax\or\relax
  2047.       \or \hbox to \@normalhsize{\box1\hfil\box3}%
  2048.       \or \hbox to \@normalhsize{\box1\hfil\box3\hfil\box5}%
  2049.       \or \hbox to \@normalhsize{\box1\hfil\box3\hfil\box5\hfil\box7}%
  2050.     \fi
  2051.   \setbox\@partialpage = \box0
  2052. \def\@columnoutput{%
  2053.   \@columnsplit
  2054.   \hsize = \@normalhsize % Local to \output's group.
  2055.   \vsize = \@normalvsize
  2056.   \the\previousoutput
  2057.   \unvbox\@partialpage
  2058.   \penalty\outputpenalty
  2059.   \global\vsize = \@numcolumns\@normalvsize
  2060. \def\singlecolumn{%
  2061.   \@ndcolumns
  2062.   \chardef\@numcolumns = 1
  2063.   \vskip\belowcolumnskip
  2064.   \nointerlineskip
  2065. \def\@endcolumns{%
  2066.   \global\let\@ndcolumns = \relax
  2067.   \par % Shouldn't start in horizontal mode.
  2068.   \global\output = {\global\setbox1 = \box255}%
  2069.   \pagegoal = \pagetotal
  2070.   \eject                    % Exercise the page builder, i.e., \output.
  2071.   \global\setbox255 = \box1 % Retrieve what the fake \output set.
  2072.   \@columnsplit
  2073.   \global\vsize = \@normalvsize
  2074.   \global\hsize = \@normalhsize
  2075.   \global\output = \expandafter{\the\previousoutput}%
  2076.   \ifvoid\topins\else\topinsert\unvbox\topins\endinsert\fi
  2077.   \unvbox255
  2078. \def\columnfill{%
  2079.   \dimen@ = \@normalvsize
  2080.   \advance\dimen@ by -\pagetotal
  2081.   \kern\dimen@
  2082. \let\wlog = \@plainwlog
  2083. \catcode`@ = \@eplainoldatcode
  2084. \def\fmtname{eplain}%
  2085. \def\eplain{t}%
  2086. {\edef\plainversion{\fmtversion}%
  2087.  \xdef\fmtversion{2.6:  2 May 1994 (and plain \plainversion)}%
  2088.